DESCRIPTION

    This distribution contains various examples of Sah schemas in its
    per-dist share dir.

    This POD also contains examples of schemas.

EXAMPLES

    The examples are written in JSON with Javascript-style comments (//
    comment).

 Simple

     # integer, optional
     "int"
    
     // required integer
     "int*"
    
     // same thing
     ["int", {"req": 1}]
    
     // integer between 1 and 10
     ["int*", {"min": 1, "max": 10}]
    
     // same thing, the curly brace is optional (unless for advanced stuff)
     ["int*", "min", 1, "max", 10]
    
     // array of integers between 1 and 10
     ["array*", {"of": ['int*', "between": [1, 10]]}]
    
     // a byte (let's assign it to a new type 'byte')
     ["int", {"between": [0,255]}]
    
     // a byte that's divisible by 3
     ["byte", {"div_by": 3}]
    
     // a byte that's divisible by 3 *and* 5
     ["byte", {'div_by&": [3, 5]}]
    
     // a byte that's divisible by 3 *or* 5
     ["byte", {"div_by|": [3, 5]}]
    
     // a byte that's *in*divisible by 3
     ["byte", {"!div_by": 3}]

 Clause attribute

 Coercion rule

    Explicitly enable rule(s) that is (are) not enabled by default:

     // allow input as comma-separated string, e.g. "1,20,3,4"
     ["array", {"of": "int", "x.perl.coerce_rules": ["str_comma_sep"]}]

    Explicitly disable rule(s) that is (are) enabled by default:

     // don't allow duration to be coerced from integer (number of seconds)
     ["duration", {"x.perl.coerce_rules": ["-float_secs"]}]

 Expression

 Function

 Merging

     // an address hash (let's assign it to a new type called 'address')
     ["hash", {
         // recognized keys
         "keys": {
             "line1":    ["str*", {"max_len": 80}],
             "line2":    ["str*", {"max_len": 80}],
             "city":     ["str*", {"max_len": 60}],
             "province": ["str*", {"max_len": 60}],
             "postcode": ["str*", {"len_between": [4, 15], "match": "^[\w-]{4,15}$"}],
             "country":  ["str*", {"len": 2, "match": "^[A-Z][A-Z]$"}]
         },
         // keys that must exist in data
         "req_keys": ["line1", "city", "province", "postcode", "country"]
      ]
    
      // a US address, let's base it on 'address' but change 'postcode' to
      // 'zipcode'. also, require country to be set to 'US'
      ["address", {
          "merge.subtract.keys": {"postcode": null},
          "merge.normal.keys": {
              "zipcode": ["str*", "len", 5, "match", "^\d{5}$"],
              "country": ["str*", "is", "US"]
          },
          "merge.subtract.req_keys": ["postcode"],
          "merge.add.req_keys": ["zipcode"]
      ]

SEE ALSO

    Sah specification, which contains a spectest in its per-dist share dir.

    Data::Sah, Perl implementation for Sah.

    Data::Sah::Coerce for more information about coercion.

    Various Sah::Schema::* modules (in Sah::Schema::* or Sah::Schemas::*
    distributions) which contain schemas in Perl modules.

