pianod2
multisource multiuser scriptable networked music player
parsnip_schema.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <config.h>
13 
14 #include <map>
15 #include <unordered_map>
16 #include <string>
17 #include <set>
18 #include <limits>
19 #include <regex>
20 
21 #include "parsnip.h"
22 #include "parsnip_command.h"
23 
24 namespace Parsnip {
25  using SchemaIntegratorCallback = std::function <void (const int, const class DictionarySchema &)>;
26 
27  // Base class for schema validation components.
28  class SchemaBase {
29  friend class ListSchema;
30  protected:
32  using SchemaRegex = std::basic_regex <StringType::value_type>;
33 
34  bool nullable = false;
35 
36  SchemaBase () = default;
37  SchemaBase (const SchemaBase &) = default;
38  SchemaBase (SchemaBase &&) = default;
39  SchemaBase &operator =(const SchemaBase &) = default;
41  SchemaBase (const Parsnip::Data &schema_spec);
42 
47  inline void checkType (Data::Type expected, const Parsnip::Data &entry) const {
48  if (!nullable || entry.datatype != Data::Type::Null) {
49  entry.mandateType (expected);
50  }
51  }
52 
56  inline bool isValidlyNull (const Parsnip::Data &entry) const {
57  return (nullable && entry.datatype == Data::Type::Null);
58  }
59 
64  inline bool isType (Data::Type expected, const Parsnip::Data &entry) const {
65  return (entry.datatype == expected);
66  }
67 
68  public:
71  virtual SchemaBase *createCopy () const = 0;
72  virtual ~SchemaBase() = default;
73 
77  virtual void validate (const Parsnip::Data &entry) const = 0;
78 
82  virtual bool operator== (const SchemaBase &other) const;
83  inline bool operator!= (const SchemaBase &other) const {
84  return !operator== (other);
85  }
86 
95  virtual void mergeSchemas (const SchemaBase &from);
96 
101  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_indent = false) const = 0;
102  };
103 
104  /*
105  * Schema Elements
106  */
107 
109  class UncheckedSchema : public SchemaBase {
110  public:
111  UncheckedSchema() = default;
112  UncheckedSchema (const UncheckedSchema &) = default;
116  virtual UncheckedSchema *createCopy () const override;
117 
118  virtual void validate (const Parsnip::Data &) const override;
119  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
120  };
121 
123  class TypeSchema : public SchemaBase {
124  private:
126 
127  public:
128  TypeSchema() = default;
129  TypeSchema (const TypeSchema &) = default;
130  TypeSchema (TypeSchema &&) = default;
131  TypeSchema &operator= (const TypeSchema &) = default;
133  TypeSchema (const Data::Type require);
134  TypeSchema (const Data::Type require, const Parsnip::Data &schema_spec);
135  virtual TypeSchema *createCopy () const override;
136 
137  virtual void validate (const Parsnip::Data &entry) const override;
138  virtual bool operator== (const SchemaBase &other) const override;
139  virtual void mergeSchemas (const SchemaBase &from) override;
140  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
141  };
142 
146  class StringSchema : public SchemaBase {
147  public:
148  using size_type = StringType::size_type;
149  protected:
152  public:
154  StringSchema (size_type min = 0, size_type max = std::numeric_limits<size_type>::max());
155  StringSchema (const StringSchema &) = default;
156  StringSchema (StringSchema &&) = default;
157  StringSchema &operator= (const StringSchema &) = default;
159  StringSchema (const Parsnip::Data &schema_spec);
160  virtual StringSchema *createCopy () const override;
161 
162  virtual void validate (const Parsnip::Data &entry) const override;
163  virtual bool operator== (const SchemaBase &other) const override;
164  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
165  };
166 
167 
170  class RegExSchema : public StringSchema {
171  public:
172  using size_type = StringType::size_type;
173  private:
176  public:
177  RegExSchema (const StringType &express, bool case_blind = false, size_type min = 0, size_type max = std::numeric_limits<size_type>::max());
178  RegExSchema (const RegExSchema &) = default;
179  RegExSchema (RegExSchema &&) = default;
180  RegExSchema &operator= (const RegExSchema &) = default;
182  RegExSchema (const Parsnip::Data &schema_spec);
183  virtual RegExSchema *createCopy () const override;
184 
185  virtual void validate (const Parsnip::Data &entry) const override;
186  virtual bool operator== (const SchemaBase &other) const override;
187  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
188  };
189 
190 
192  class KeywordSchema : public SchemaBase {
193  private:
194  std::set<StringType> valid_values;
195  bool ignore_case = true;
196  public:
197  KeywordSchema() = default;
198  KeywordSchema (const KeywordSchema &) = default;
199  KeywordSchema (KeywordSchema &&) = default;
202  KeywordSchema (const std::string &word);
203  KeywordSchema (const Parsnip::Data &schema_spec);
204  virtual KeywordSchema *createCopy () const override ;
205  void addKeyword (const std::string &word);
206  virtual void validate (const Parsnip::Data &entry) const override;
207  virtual bool operator== (const SchemaBase &other) const override;
208  virtual void mergeSchemas (const SchemaBase &from) override;
209  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
210  };
211 
213  template <typename NumericType>
214  class RangeSchema : public SchemaBase {
215  public:
216  using value_type = NumericType;
217 
218  private:
219  bool minimumIsInclusive = true;
220  NumericType minimum;
221  bool maximumIsInclusive = true;
222  NumericType maximum;
223 
224  public:
225  RangeSchema (const NumericType min = std::numeric_limits<NumericType>::lowest(),
226  const NumericType max = std::numeric_limits<NumericType>::max());
227  RangeSchema() = default;
228  RangeSchema (const RangeSchema &) = default;
229  RangeSchema (RangeSchema &&) = default;
230  RangeSchema &operator= (const RangeSchema &) = default;
232  RangeSchema (const Parsnip::Data &schema_spec);
233  virtual RangeSchema *createCopy () const override;
234 
235  virtual void validate (const Parsnip::Data &entry) const override;
236  virtual bool operator== (const SchemaBase &other) const override;
237  virtual void mergeSchemas (const SchemaBase &from) override;
238  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
239  };
240 
242 
243  // Schema class for accepting integers.
244  class IntegerSchema : public RangeSchema <long> {
246  private:
248  public:
250  IntegerSchema (const Parsnip::Data &schema_spec);
251  virtual IntegerSchema *createCopy () const override;
252 
253  virtual bool operator== (const SchemaBase &other) const override;
254  virtual void validate (const Parsnip::Data &entry) const override;
255  };
256 
258  class OptionSchema : public SchemaBase {
259  private:
261 
262  public:
264  OptionSchema() = default;
265  OptionSchema (const OptionSchema &) = default;
266  OptionSchema (OptionSchema &&) = default;
267  OptionSchema &operator= (const OptionSchema &) = default;
269  OptionSchema (const SchemaRef &option_schema);
270  virtual OptionSchema *createCopy () const override;
271 
272  virtual void validate (const Parsnip::Data &entry) const override;
273  virtual bool operator== (const SchemaBase &other) const override;
274  virtual void mergeSchemas (const SchemaBase &from) override;
275  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
276  };
277 
280  class ListSchema : public SchemaBase {
281  public:
282  using size_type = Data::ListType::size_type;
283  private:
286  size_type maximum_allowed = std::numeric_limits<int>::max();
288 
289  public:
290  ListSchema() = default;
291  ListSchema (const ListSchema &from) = default;
292  ListSchema (ListSchema &&) = default;
293  ListSchema &operator= (const ListSchema &from) = default;
295  ListSchema (SchemaBaseRef &&, size_type minimum = 0, size_type maximum = std::numeric_limits<size_type>::max());
296  ListSchema (const SchemaBase &, size_type minimum = 0, size_type maximum = std::numeric_limits<size_type>::max());
297  ListSchema (const Parsnip::Data &schema_spec);
298  virtual ListSchema *createCopy () const override;
299 
300  virtual void validate (const Parsnip::Data &entry) const override;
301  virtual bool operator== (const SchemaBase &other) const override;
302  virtual void mergeSchemas (const SchemaBase &from) override;
303  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
304  };
305 
307  class DictionarySchema : public SchemaBase {
308  friend class ValueEvaluator;
310  friend class KeywordEvaluator;
311  friend class OptionEvaluator;
312  public:
313  using Dependencies = std::set<std::string>;
314  using size_type = unsigned int;
316  private:
318  size_type maximum_members = std::numeric_limits<size_type>::max();
319  protected:
321  public:
324  bool mandatory = false;
325 
326  bool operator== (const DictionaryMember &other) const;
327  };
328 
330  std::map <std::string, DictionaryMember> members;
331  AdditionalMemberNames tolerance = AdditionalMemberNames::NONE;
334 
335  public:
336  DictionarySchema() = default;
337  DictionarySchema (const DictionarySchema &) = default;
341  DictionarySchema (const Parsnip::Data &schema_spec);
342  virtual DictionarySchema *createCopy () const override;
343 
344  void addMember (const char *name, const SchemaBase &schema, bool mandatory = false,
345  const Dependencies &dependencies = NoDependencies);
346  void replaceMember (const char *name, const SchemaBase &schema);
347  void removeMember (const char *name);
348 
349  virtual void validate (const Parsnip::Data &entry) const override;
350  virtual bool operator== (const SchemaBase &other) const override;
351  virtual void mergeSchemas (const SchemaBase &from) override;
352  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
353  };
354 
355 
358  class ConjunctionSchema : public SchemaBase {
359  public:
360  enum class Action {
361  All,
362  Any,
363  ExactlyOne,
364  Not
365  };
366  static bool is_conjunction (const Parsnip::Data &schema_spec);
367  private:
368  static const std::unordered_map<std::string, Action> key_names;
369  std::string action_name;
371  using ChildrenList = std::vector<SchemaBaseRef>;
373  static std::string get_action_name (const Parsnip::Data &schema_spec);
374  Parsnip::Data merge_dictionaries (const Parsnip::Data &baseline, const Parsnip::Data &overrides);
375  public:
380  ConjunctionSchema (const Parsnip::Data &schema_spec);
381  virtual ConjunctionSchema *createCopy () const override;
382 
383  virtual void validate (const Parsnip::Data &entry) const override;
384  virtual bool operator== (const SchemaBase &other) const override;
385  virtual std::ostream &dump (std::ostream &target, int indent, bool suppress_ident = false) const override;
386  };
387 
389  class InvalidSchema : public Exception {
390  public:
391  inline InvalidSchema (const std::string &reason) : Exception ("invalid schema", reason) {};
392  };
393 
394 }
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
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
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 serialization.
Parsnip command-line parsing.