def conforms

bend-schema-lib@0.4.1.0 · core.bend:624

import bend-schema-lib@0.4.1.0/core.bend as Core
import Base

624def conforms(~rule: Nat -> Raw -> Maybe<&2, Err>, s: Schema, r: Raw, +prev: Maybe<&2, Nat>) -> Bool:
625  match s r:
626    case SNat{} RNum{n}:
627      True{}
628    case SNatIn{+lo, +hi} RNum{+n}:
629      num_ok(lo, hi, n)
630    case SStr{} RStr{x}:
631      True{}
632    case SStrLen{+lo, +hi, +s2} +x:
633      Bool.and(conforms(~rule, s2, x, prev), len_ok(lo, hi, x))
634    case SListLen{+lo, +hi, +s2} +r:
635      Bool.and(list_len_ok(lo, hi, r), conforms(~rule, s2, r, None{}))
636    case SOpt{inner} RNull{}:
637      True{}
638    case SOpt{inner} x:
639      conforms(~rule, inner, x, None{})
640    case SOptional{+inner} +x:
641      Bool.or(is_missing(x), conforms(~rule, inner, x, None{}))
642    case SList{e} RNil{}:
643      True{}
644    case SList{+e} RCons{h, t}:
645      Bool.and(conforms(~rule, e, h, None{}), conforms(~rule, SList{e}, t, None{}))
646    case SJson{} RJson{value}:
647      valid_json(value)
648    case SInt{} RNum{n}:
649      True{}
650    case SInt{} RNeg{n}:
651      True{}
652    case SIntIn{+lo, +hi} RNum{+n}:
653      int_ok(lo, hi, IPos{n})
654    case SIntIn{+lo, +hi} RNeg{+n}:
655      int_ok(lo, hi, INeg{n})
656    case SField{+name, fs, rest} REnd{}:
657      Bool.and(conforms(~rule, fs, RMissing{}, None{}), conforms(~rule, rest, REnd{}, None{}))
658    case SField{+name, fs, rest} RKey{+k, +v, +o}:
659      Bool.and(key_once(name, RKey{k, v, o}), Bool.and(conforms(~rule, fs, lookup(name, RKey{k, v, o}), None{}), conforms(~rule, rest, RKey{k, v, o}, None{})))
660    case SEnd{} REnd{}:
661      True{}
662    case SEnd{} RKey{k, v, o}:
663      True{}
664    case SRule{+s2, +tag} +x:
665      Bool.and(conforms(~rule, s2, x, prev), Maybe.is_none(&2, Err, rule(tag, x)))
666    case SStrict{+s2} +x:
667      Bool.and(conforms(~rule, s2, x, prev), no_extra(key_names(s2), x))
668    case STagged{+k, +n, cs, rest} +x:
669      pick_bool(is_tag(k, n, x), Bool.and(key_once(k, x), conforms(~rule, cs, drop_key(k, x), None{})), conforms(~rule, rest, x, None{}))
670    case STagEnd{k} x:
671      False{}  # the end of a tagged chain: no case matched
672    case SBool{} RBool{b}:
673      True{}  # any boolean is a boolean, and nothing else is
674    case STrue{} RBool{b}:
675      b
676    case SEnum{names} RStr{+x}:
677      in_names(x, names)
678    case SVariant{+name, +vs, +rest} REnd{}:
679      conforms(~rule, rest, REnd{}, None{})
680    case SVariant{+name, +vs, +rest} RKey{+k, +v, +o}:
681      pick_bool(is_missing(lookup(name, RKey{k, v, o})), conforms(~rule, rest, RKey{k, v, o}, None{}), Bool.and(key_once(name, RKey{k, v, o}), Bool.and(conforms(~rule, vs, lookup(name, RKey{k, v, o}), None{}), none_present(rest, RKey{k, v, o}))))
682    case STuple{ts, rest} RCons{h, t}:
683      Bool.and(conforms(~rule, ts, h, None{}), conforms(~rule, rest, t, None{}))
684    case STEnd{} RNil{}:
685      True{}
686    case SEither{+l, +r} +x:
687      pick_bool(has_kind(l, kind_of(x)), conforms(~rule, l, x, prev), Bool.and(has_kind(r, kind_of(x)), conforms(~rule, r, x, prev)))
688    case _ _:
689      False{}

Uses (27)

Used by (4)