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{}
672 case SBool{} RBool{b}:
673 True{}
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{}