def check

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

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

850def check(~rule: Nat -> Raw -> Maybe<&2, Err>, s: Schema, r: Raw, +prev: Maybe<&2, Nat>) -> Maybe<&2, Err>:
851  match s r:
852    case SNat{} RNum{n}:
853      None{}
854    case SNat{} x:
855      here(missing_or(x, NotNat{}))
856    case SStr{} RStr{x}:
857      None{}
858    case SStr{} x:
859      here(missing_or(x, NotString{}))
860    case SNatIn{+lo, +hi} RNum{+n}:
861      nat_in(lo, hi, RNum{n})
862    case SNatIn{lo_, hi_} +x:
863      here(missing_or(x, NotNat{}))
864    case SStrLen{+lo, +hi, +s2} +x:
865      first(check(~rule, s2, x, prev), len_err(lo, hi, x))
866    case SListLen{+lo, +hi, +s2} +r:
867      first(count_err(lo, hi, r), check(~rule, s2, r, None{}))
868    case SOpt{inner} RNull{}:
869      None{}
870    case SOpt{inner} x:
871      check(~rule, inner, x, None{})
872    case SOptional{inner} RMissing{}:
873      None{}
874    case SOptional{inner} x:
875      check(~rule, inner, x, None{})
876    case SList{e} RNil{}:
877      None{}
878    case SList{+e} RCons{h, t}:
879      first(under(AtIndex{0n}, check(~rule, e, h, None{})), later_l(check(~rule, SList{e}, t, None{})))
880    case SJson{} RJson{value}:
881      in_err(valid_json(value), NotJson{})
882    case SJson{} x:
883      here(missing_or(x, NotJson{}))
884    case SInt{} RNum{n}:
885      None{}
886    case SInt{} RNeg{n}:
887      None{}
888    case SInt{} x:
889      here(missing_or(x, NotInt{}))
890    case SIntIn{+lo, +hi} RNum{+n}:
891      in_err(int_ok(lo, hi, IPos{n}), IntNotIn{lo, hi})
892    case SIntIn{+lo, +hi} RNeg{+n}:
893      in_err(int_ok(lo, hi, INeg{n}), IntNotIn{lo, hi})
894    case SIntIn{lo_, hi_} x:
895      here(missing_or(x, NotInt{}))
896    case SList{e} x:
897      here(missing_or(x, NotList{}))
898    case SField{+name, fs, rest} REnd{}:
899      first(under(AtField{0n, name}, check(~rule, fs, RMissing{}, None{})), later_f(check(~rule, rest, REnd{}, None{})))
900    case SField{+name, fs, rest} RKey{+k, +v, +o}:
901      first(key_err(key_once(name, RKey{k, v, o}), name), first(under(AtField{0n, name}, check(~rule, fs, lookup(name, RKey{k, v, o}), None{})), later_f(check(~rule, rest, RKey{k, v, o}, None{}))))
902    case SField{name, fs, rest} x:
903      here(missing_or(x, NotObject{}))
904    case SEnd{} REnd{}:
905      None{}
906    case SEnd{} RKey{k, v, o}:
907      None{}
908    case SEnd{} x:
909      here(missing_or(x, NotObject{}))
910    case SRule{+s2, +tag} +x:
911      first(check(~rule, s2, x, prev), rule(tag, x))
912    case SStrict{+s2} +x:
913      first(check(~rule, s2, x, prev), extra_err(key_names(s2), x))
914    case STagged{+k, +n, cs, rest} +x:
915      pick_err(is_tag(k, n, x), first(key_err(key_once(k, x), k), check(~rule, cs, drop_key(k, x), None{})), check(~rule, rest, x, None{}))
916    case STagEnd{k} x:
917      tag_err(k, x)
918    case SBool{} RBool{b}:
919      None{}
920    case SBool{} +x:
921      here(missing_or(x, NotBool{}))
922    case STrue{} RBool{b}:
923      true_err(b)
924    case STrue{} x:
925      here(missing_or(x, NotTrue{}))
926    case SEnum{names} RStr{+x}:
927      enum_err(in_names(x, names))
928    case SEnum{names} x:
929      here(missing_or(x, NotOneOf{}))
930    case SVariant{+name, +vs, +rest} REnd{}:
931      later_f(check(~rule, rest, REnd{}, None{}))
932    case SVariant{+name, +vs, +rest} RKey{+k, +v, +o}:
933      pick_err(is_missing(lookup(name, RKey{k, v, o})), later_f(check(~rule, rest, RKey{k, v, o}, None{})), first(key_err(key_once(name, RKey{k, v, o}), name), first(under(AtField{0n, name}, check(~rule, vs, lookup(name, RKey{k, v, o}), None{})), later_f(dup_err(rest, RKey{k, v, o})))))
934    case SVariant{+name, +vs, +rest} x:
935      here(missing_or(x, NotObject{}))
936    case SVEnd{} REnd{}:
937      here(NoVariant{})
938    case SVEnd{} RKey{k, v, o}:
939      here(NoVariant{})
940    case SVEnd{} x:
941      here(missing_or(x, NotObject{}))
942    case STuple{ts, rest} RCons{h, t}:
943      first(under(AtIndex{0n}, check(~rule, ts, h, None{})), later_l(check(~rule, rest, t, None{})))
944    case STuple{ts, rest} RNil{}:
945      here(TooShort{})
946    case STuple{ts, rest} x:
947      here(missing_or(x, NotList{}))
948    case STEnd{} RNil{}:
949      None{}
950    case STEnd{} RCons{h, t}:
951      here(TooLong{})
952    case STEnd{} x:
953      here(missing_or(x, NotList{}))
954    case SEither{+l, +r} +x:
955      pick_err(has_kind(l, kind_of(x)), check(~rule, l, x, prev), pick_err(has_kind(r, kind_of(x)), check(~rule, r, x, prev), here(missing_or(x, no_alt(SEither{l, r})))))

Uses (37)

Used by (1)