15 #include <unordered_map>
32 using SchemaRegex = std::basic_regex <StringType::value_type>;
101 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_indent =
false)
const = 0;
119 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
140 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
164 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
187 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
209 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
213 template <
typename NumericType>
225 RangeSchema (
const NumericType min = std::numeric_limits<NumericType>::lowest(),
226 const NumericType max = std::numeric_limits<NumericType>::max());
238 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
275 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
303 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
330 std::map <std::string, DictionaryMember>
members;
352 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
368 static const std::unordered_map<std::string, Action>
key_names;
385 virtual std::ostream &
dump (std::ostream &target,
int indent,
bool suppress_ident =
false)
const override;
A meta-schema that determines if any, all, or exactly one or none of its subschemas are valid.
Definition: parsnip_schema.h:358
std::vector< SchemaBaseRef > ChildrenList
Definition: parsnip_schema.h:371
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:1018
static std::string get_action_name(const Parsnip::Data &schema_spec)
Retrieve the conjunction action name from a dictionary.
Definition: parsnip_schema.cpp:911
ConjunctionSchema & operator=(const ConjunctionSchema &)=default
static const std::unordered_map< std::string, Action > key_names
Name-to-enumeration mappings for the various conjunctions.
Definition: parsnip_schema.h:368
Action action
Definition: parsnip_schema.h:370
virtual void validate(const Parsnip::Data &entry) const override
Verify that Data matches the schema.
Definition: parsnip_schema.cpp:975
ConjunctionSchema(ConjunctionSchema &&)=default
ChildrenList children
Definition: parsnip_schema.h:372
Action
Definition: parsnip_schema.h:360
static bool is_conjunction(const Parsnip::Data &schema_spec)
Checks a schema specification for a conjunction.
Definition: parsnip_schema.cpp:898
std::string action_name
Definition: parsnip_schema.h:369
Parsnip::Data merge_dictionaries(const Parsnip::Data &baseline, const Parsnip::Data &overrides)
Definition: parsnip_schema.cpp:928
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:1008
virtual ConjunctionSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:971
ConjunctionSchema(const ConjunctionSchema &)=default
Generic data type.
Definition: parsnip.h:81
Type
Types that may be stored in the data.
Definition: parsnip.h:99
@ Null
Nothing is present.
std::string StringType
Definition: parsnip.h:95
void mandateType(Type type) const
Definition: parsnip_types.cpp:30
Type datatype
Type presently stored in object.
Definition: parsnip.h:117
Definition: parsnip_schema.h:320
bool operator==(const DictionaryMember &other) const
Determine if two dictionary members are equivalent to each other, deep comparing the schema.
Definition: parsnip_schema.cpp:607
SchemaBaseRef member_schema
Schema for this dictionary member.
Definition: parsnip_schema.h:322
bool mandatory
Whether element must be present.
Definition: parsnip_schema.h:324
Dependencies expects
Other elements that must be present when this one is.
Definition: parsnip_schema.h:323
Schema component for validating dictionaries.
Definition: parsnip_schema.h:307
std::map< std::string, DictionaryMember > members
Definition: parsnip_schema.h:330
unsigned int size_type
Definition: parsnip_schema.h:314
std::set< std::string > Dependencies
Definition: parsnip_schema.h:313
SchemaRegex additional_member_regex
Definition: parsnip_schema.h:332
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:751
DictionarySchema(DictionarySchema &&)=default
void removeMember(const char *name)
Remove a member from the schema.
Definition: parsnip_schema.cpp:714
DictionarySchema & operator=(const DictionarySchema &)=default
static const Dependencies NoDependencies
Definition: parsnip_schema.h:315
virtual void validate(const Parsnip::Data &entry) const override
Validate a dictionary:
Definition: parsnip_schema.cpp:762
DictionarySchema()=default
virtual void mergeSchemas(const SchemaBase &from) override
Merge elements into the current schema.
Definition: parsnip_schema.cpp:818
AdditionalMemberNames tolerance
Allow unrecognized members in the dictionary?
Definition: parsnip_schema.h:331
DictionarySchema(const DictionarySchema &)=default
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:721
void addMember(const char *name, const SchemaBase &schema, bool mandatory=false, const Dependencies &dependencies=NoDependencies)
Add a member to a dictionary schema.
Definition: parsnip_schema.cpp:694
SchemaBaseRef additional_member_schema
Definition: parsnip_schema.h:333
size_type minimum_members
Definition: parsnip_schema.h:317
virtual DictionarySchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:747
size_type maximum_members
Definition: parsnip_schema.h:318
void replaceMember(const char *name, const SchemaBase &schema)
Replace a member in the schema, retaining original mandatory status and dependencies.
Definition: parsnip_schema.cpp:708
AdditionalMemberNames
Definition: parsnip_schema.h:329
@ PATTERN
Definition: parsnip_schema.h:329
@ ANY
Definition: parsnip_schema.h:329
@ NONE
Definition: parsnip_schema.h:329
Class representing issues related to serialization & parsing.
Definition: parsnip.h:41
std::string reason
Storage for the exception explanation.
Definition: parsnip.h:45
Definition: parsnip_schema.h:244
virtual IntegerSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:432
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:436
IntegerSchema(const Parsnip::Data &schema_spec)
Construct an integer schema from a schema specification.
Definition: parsnip_schema.cpp:428
value_type multiple
If non-0, valid values are a multiple of this number.
Definition: parsnip_schema.h:247
virtual void validate(const Parsnip::Data &entry) const override
Validate item range: ensure the datatype falls within the allowed range.
Definition: parsnip_schema.cpp:441
Parsing/command patterns produce schema inconsistency.
Definition: parsnip_schema.h:389
InvalidSchema(const std::string &reason)
Definition: parsnip_schema.h:391
Evaluate a keyword in a command line.
Definition: parsnip_evaluate.h:244
Schema component accepting strings with certain values.
Definition: parsnip_schema.h:192
KeywordSchema & operator=(const KeywordSchema &)=default
bool ignore_case
Definition: parsnip_schema.h:195
virtual KeywordSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:263
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:288
KeywordSchema(KeywordSchema &&)=default
virtual void mergeSchemas(const SchemaBase &from) override
Merge elements into the current schema.
Definition: parsnip_schema.cpp:308
std::set< StringType > valid_values
Definition: parsnip_schema.h:194
virtual void validate(const Parsnip::Data &entry) const override
Validate a Keyword: ensure the datatype is a string, and that it matches one of the allowed values.
Definition: parsnip_schema.cpp:295
KeywordSchema(const KeywordSchema &)=default
void addKeyword(const std::string &word)
Add an additional keyword that the schema will allow.
Definition: parsnip_schema.cpp:269
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:316
Schema component for lists.
Definition: parsnip_schema.h:280
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:545
size_type minimum_required
Definition: parsnip_schema.h:285
virtual void mergeSchemas(const SchemaBase &from) override
Merge elements into the current schema.
Definition: parsnip_schema.cpp:577
bool single_as_nonlist_allowed
Definition: parsnip_schema.h:287
SchemaBaseRef member_schema
Definition: parsnip_schema.h:284
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:589
ListSchema(ListSchema &&)=default
size_type maximum_allowed
Definition: parsnip_schema.h:286
virtual ListSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:541
ListSchema(const ListSchema &from)=default
ListSchema & operator=(const ListSchema &from)=default
virtual void validate(const Parsnip::Data &entry) const override
Validate a list: ensure all elements conform to a single schema.
Definition: parsnip_schema.cpp:555
Data::ListType::size_type size_type
Definition: parsnip_schema.h:282
Evaluate remainder with a different parser.
Definition: parsnip_evaluate.h:315
Schema adapter component that allows use of schemas from option parsers.
Definition: parsnip_schema.h:258
virtual void validate(const Parsnip::Data &entry) const override
Validate the option's schema by calling that scheme's validator.
Definition: parsnip_schema.cpp:474
SchemaRef schema
Definition: parsnip_schema.h:260
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:492
OptionSchema(const OptionSchema &)=default
virtual void mergeSchemas(const SchemaBase &from) override
Merge elements into the current schema.
Definition: parsnip_schema.cpp:479
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:468
OptionSchema()=default
Validate a type schema: ensure the datatype is as expected.
OptionSchema(OptionSchema &&)=default
OptionSchema & operator=(const OptionSchema &)=default
virtual OptionSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:464
Schema component for numeric data, either Integer or Real.
Definition: parsnip_schema.h:214
RangeSchema(const RangeSchema &)=default
virtual RangeSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:341
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:386
NumericType value_type
Definition: parsnip_schema.h:216
RangeSchema(RangeSchema &&)=default
NumericType minimum
Definition: parsnip_schema.h:220
RangeSchema & operator=(const RangeSchema &)=default
virtual void mergeSchemas(const SchemaBase &from) override
Merge elements into the current schema.
Definition: parsnip_schema.cpp:394
virtual void validate(const Parsnip::Data &entry) const override
Validate item range: ensure the datatype falls within the allowed range.
Definition: parsnip_schema.cpp:367
bool maximumIsInclusive
Definition: parsnip_schema.h:221
bool minimumIsInclusive
Definition: parsnip_schema.h:219
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:403
NumericType maximum
Definition: parsnip_schema.h:222
Schema component requiring data be a string of characters matching a regular expression.
Definition: parsnip_schema.h:170
StringType expression
Definition: parsnip_schema.h:174
virtual RegExSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:224
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:249
RegExSchema(const StringType &express, bool case_blind=false, size_type min=0, size_type max=std::numeric_limits< size_type >::max())
Construct a regular expression validator.
Definition: parsnip_schema.cpp:207
RegExSchema & operator=(const RegExSchema &)=default
RegExSchema(RegExSchema &&)=default
SchemaRegex regex
Definition: parsnip_schema.h:175
RegExSchema(const RegExSchema &)=default
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:243
virtual void validate(const Parsnip::Data &entry) const override
Verify that Data matches the schema.
Definition: parsnip_schema.cpp:228
Gather the rest of the command line tokens in a list.
Definition: parsnip_evaluate.h:302
Definition: parsnip_schema.h:28
virtual ~SchemaBase()=default
void checkType(Data::Type expected, const Parsnip::Data &entry) const
Check that Data item is an allowed type.
Definition: parsnip_schema.h:47
virtual void validate(const Parsnip::Data &entry) const =0
Verify that Data matches the schema.
SchemaBase(const SchemaBase &)=default
bool isValidlyNull(const Parsnip::Data &entry) const
Determine if the data is Null and if that is allowed.
Definition: parsnip_schema.h:56
virtual void mergeSchemas(const SchemaBase &from)
Merge elements into the current schema.
Definition: parsnip_schema.cpp:82
bool operator!=(const SchemaBase &other) const
Definition: parsnip_schema.h:83
std::basic_regex< StringType::value_type > SchemaRegex
Definition: parsnip_schema.h:32
Data::StringType StringType
Definition: parsnip_schema.h:31
bool nullable
If true, element may be null.
Definition: parsnip_schema.h:34
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_indent=false) const =0
Render the schema in human-friendly text.
virtual SchemaBase * createCopy() const =0
Create an identical, deep copy of the schema.
SchemaBase & operator=(const SchemaBase &)=default
bool isType(Data::Type expected, const Parsnip::Data &entry) const
Check if a data object is a particular type.
Definition: parsnip_schema.h:64
virtual bool operator==(const SchemaBase &other) const
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:77
SchemaBase(SchemaBase &&)=default
Smart pointer for schemas, with unusual ability to be copied.
Definition: parsnip.h:601
Schema component requiring data be a string of characters (no control characters).
Definition: parsnip_schema.h:146
StringSchema(StringSchema &&)=default
StringSchema(const StringSchema &)=default
StringSchema & operator=(const StringSchema &)=default
size_type min_length
Definition: parsnip_schema.h:150
StringType::size_type size_type
Definition: parsnip_schema.h:148
virtual StringSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:166
StringSchema(size_type min=0, size_type max=std::numeric_limits< size_type >::max())
Validate a type schema: ensure the datatype is as expected.
Definition: parsnip_schema.cpp:156
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:186
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:192
virtual void validate(const Parsnip::Data &entry) const override
Verify that Data matches the schema.
Definition: parsnip_schema.cpp:170
size_type max_length
Definition: parsnip_schema.h:151
Schema component requiring data be a particular type.
Definition: parsnip_schema.h:123
virtual TypeSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:127
Data::Type expected
Definition: parsnip_schema.h:125
virtual bool operator==(const SchemaBase &other) const override
Check if two schemas perform the same validation.
Definition: parsnip_schema.cpp:131
virtual void mergeSchemas(const SchemaBase &from) override
Merge elements into the current schema.
Definition: parsnip_schema.cpp:136
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:143
virtual void validate(const Parsnip::Data &entry) const override
Verify that Data matches the schema.
Definition: parsnip_schema.cpp:123
TypeSchema(const TypeSchema &)=default
TypeSchema(TypeSchema &&)=default
TypeSchema & operator=(const TypeSchema &)=default
Schema component requiring data be a particular type.
Definition: parsnip_schema.h:109
virtual std::ostream & dump(std::ostream &target, int indent, bool suppress_ident=false) const override
Render the schema in human-friendly text.
Definition: parsnip_schema.cpp:102
virtual void validate(const Parsnip::Data &) const override
Construct a schema element that does no checking.
Definition: parsnip_schema.cpp:94
UncheckedSchema(UncheckedSchema &&)=default
UncheckedSchema(const UncheckedSchema &)=default
virtual UncheckedSchema * createCopy() const override
Create an identical, deep copy of the schema.
Definition: parsnip_schema.cpp:98
UncheckedSchema & operator=(const UncheckedSchema &)=default
UncheckedSchema()=default
Evaluate a value/fill-in field.
Definition: parsnip_evaluate.h:150
Serialization and parsing library.
Definition: mediaunit.h:26
std::function< void(const int, const class DictionarySchema &)> SchemaIntegratorCallback
Definition: parsnip_schema.h:25
std::shared_ptr< class Schema > SchemaRef
Definition: parsnip.h:609
Parsnip command-line parsing.