15#include <unordered_map>
72 extern const std::string EmptyString;
77 void operator() (
class Evaluator *free_me);
79 using EvaluatorRef = std::unique_ptr<class Evaluator, EvaluatorDeleter>;
86 EvaluatorRef evaluator;
90 using Definitions = std::vector<const char *>;
97 using OptionParserRef = std::shared_ptr<OptionParser>;
104 EvaluatorRef evaluator;
105 using OptionParsers = std::unordered_map<std::string, OptionParserRef>;
106 OptionParsers option_parsers;
109 using CommandId = int;
110 using StringType = std::string;
114 CommandId command_id;
115 const char *statement;
117 using Definitions = std::vector<Definition>;
128 Parser (
const Definitions &defs);
130 void addOptionParser (
const std::string &name,
const OptionParserRef &add);
132 Result
evaluate (
const StringType &command)
const;
134 inline bool operator!= (
const Parser &other)
const {
135 return !(*
this == other);
138 using ParserRef = std::shared_ptr<Parser>;
140 template <
typename ReturnType,
typename ContextType>
143 virtual ReturnType interpret (Parser::CommandId command_id,
const Parsnip::Data ¶meters, ContextType context) = 0;
147 template <
typename DispatchReturnType,
typename DispatchContextType>
150 const ParserRef parser;
152 using ReturnType = DispatchReturnType;
153 using ContextType = DispatchContextType;
154 using ExecutorType = std::function <ReturnType (Parser::CommandId,
const Parsnip::Data &, ContextType)>;
156 std::unordered_map <Parser::CommandId, ExecutorType> handlers;
158 int parser_number = 0;
159 std::unordered_map <Parser::CommandId, int> mapping_check;
163 void addHandler (
const Parser::Definitions &defs,
const ExecutorType &handler);
165 void addStatements (
const Parser::Definitions &defs, ExecutorType handler);
166 ReturnType
operator () (Parser::CommandId command_id,
const Parsnip::Data ¶meters, DispatchContextType context)
const;
167 ReturnType
operator () (Parser::StringType command, ContextType context)
const;
173 using CommandId = int;
174 using CommandSchemas = std::unordered_map <CommandId, SchemaBaseRef>;
175 using OptionSchemas = Schema::OptionSchemas;
176 using Dependencies = Schema::Dependencies;
179 CommandSchemas schemas;
182 const SchemaBaseRef &getSchemaForCommand (CommandId command_id)
const;
190 std::ostream &
dump (
const std::string &intro,
const CommandId command_id, std::ostream &target = std::clog)
const;
192 void addMember (
const CommandId,
const char *name,
const SchemaBase &schema,
bool mandatory =
false,
193 const Dependencies &dependencies = Schema::NoDependencies);
195 const Dependencies &dependencies = Schema::NoDependencies);
199 using SchemaSetRef = std::shared_ptr <SchemaSet>;
214 template <
typename DispatchReturnType,
typename DispatchContextType>
224 template <
typename DispatchReturnType,
typename DispatchContextType>
229 for (
auto &it : defs) {
231 if (mapping_check [it.command_id]) {
232 assert (mapping_check [it.command_id] == parser_number);
234 mapping_check [it.command_id] = parser_number;
237 handlers [it.command_id] = handler;
246 template <
typename DispatchReturnType,
typename DispatchContextType>
248 Interpreter <DispatchReturnType, DispatchContextType> *interpreter) {
250 interpreter, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3) };
251 addHandler (defs, handler);
257 template <
typename DispatchReturnType,
typename DispatchContextType>
259 parser->addStatements (defs);
260 addHandler (defs, handler);
268 template <
typename DispatchReturnType,
typename DispatchContextType>
271 ContextType context)
const {
272 return handlers.at (command_id) (command_id, parameters, context);
279 template <
typename DispatchReturnType,
typename DispatchContextType>
281 ContextType context)
const {
Generic data type.
Definition parsnip.h:81
static const struct Parsnip::Data::dictionary_t Dictionary
Dictionary flag type/value.
Schema component for validating dictionaries.
Definition parsnip_schema.h:307
Definition parsnip_command.h:148
void addStatements(const Parser::Definitions &defs, ExecutorType handler)
Add statements to the parser and register their related handler.
Definition parsnip_command.h:258
void addHandler(const Parser::Definitions &defs, const ExecutorType &handler)
Register handlers with the dispatcher.
Definition parsnip_command.h:225
ReturnType operator()(Parser::CommandId command_id, const Parsnip::Data ¶meters, DispatchContextType context) const
Dispatch a command to the executor/handler function.
Definition parsnip_command.h:269
Dispatcher(const ParserRef &parser)
Construct a dispatcher.
Definition parsnip_command.h:215
An option was supplied twice to an iterating option parser.
Definition parsnip_command.h:58
Evaluator base class.
Definition parsnip_evaluate.h:30
Class representing issues related to serialization & parsing.
Definition parsnip.h:41
More tokens were expected.
Definition parsnip_command.h:44
Definition parsnip_command.h:141
A token encountered was not one of the expected keywords.
Definition parsnip_command.h:37
A schema is not defined for a certain command ID.
Definition parsnip_command.h:65
Not numeric: A command pattern specified a number, but the token was not valid number.
Definition parsnip_command.h:30
NumberOutOfRange: The number was outside the range defined in the command pattern.
Definition parsnip_command.h:23
Evaluate remainder with a different parser.
Definition parsnip_evaluate.h:315
A class for parsing command line options (name-value pairs, for instance).
Definition parsnip_command.h:82
void addOptions(const Definitions &defs, class Parser *=nullptr)
Register new option patterns.
Definition parsnip_command.cpp:454
A class for parsing command lines.
Definition parsnip_command.h:100
Result evaluate(const StringType &command) const
Evaluate a command.
Definition parsnip_command.cpp:424
void addStatements(const Definitions &defs)
Add statements to the parser.
Definition parsnip_command.cpp:399
bool operator==(const Parser &) const
Check if a parser is identical to another parser.
Definition parsnip_command.cpp:435
void addOptionParser(const std::string &name, const OptionParserRef &add)
Register an options parser for use.
Definition parsnip_command.cpp:415
There were extra tokens at the end of the command pattern.
Definition parsnip_command.h:51
Definition parsnip_schema.h:28
Smart pointer for schemas, with unusual ability to be copied.
Definition parsnip.h:601
Schema for one JSON object.
Definition parsnip.h:612
A schema built to validate JSON messages based on command line patterns.
Definition parsnip_command.h:171
void addMember(const CommandId, const char *name, const SchemaBase &schema, bool mandatory=false, const Dependencies &dependencies=Schema::NoDependencies)
Modify a schema by adding a new dictionary member.
Definition parsnip_schema.cpp:1321
std::ostream & dump(const std::string &intro, const CommandId command_id, std::ostream &target=std::clog) const
Dump the schema in human-readable format.
Definition parsnip_schema.cpp:1307
void removeMember(const CommandId, const char *name)
Modify a schema by removing a dictionary member.
Definition parsnip_schema.cpp:1356
void validate(const CommandId, const Data &) const
Validate data against a command's schema.
Definition parsnip_schema.cpp:1299
OptionSchemas option_schemas
Schemas for each of the option parsers.
Definition parsnip_command.h:186
void replaceMember(const CommandId, const char *name, const SchemaBase &schema)
Modify a schema by replacing dictionary member.
Definition parsnip_schema.cpp:1349
Serialization and parsing library.
Definition parsnip.h:38
This does what std::default_delete would do, but is required since we haven't defined Evaluator yet.
Definition parsnip_command.h:76
Definition parsnip_command.h:113
Definition parsnip_command.h:120
CommandId command_id
< ID of command pattern that was matched.
Definition parsnip_command.h:122
Parsnip::Data parameters
Parameters collected from the command line.
Definition parsnip_command.h:124