def defect
import bend-schema-lib@0.4.1.0/core.bend as Coreimport Base
1194def defect(~rule: Nat -> Raw -> Maybe<&2, Err>, s: Schema, r: Raw, +prev: Maybe<&2, Nat>, p: List<&2, Step>) -> Maybe<&2, Why>:
1195 match s r p:
1196 case SJson{} RJson{value} q:
1197 guard(Bool.not(valid_json(value)), at_end(NotJson{}, q))
1198 case SJson{} x q:
1199 at_end(missing_or(x, NotJson{}), q)
1200 case SInt{} x q:
1201 int_defect(x, q)
1202 case SIntIn{+lo, +hi} x q:
1203 int_in_defect(lo, hi, x, q)
1204 case SNat{} x q:
1205 nat_defect(x, q)
1206 case SStr{} x q:
1207 str_defect(x, q)
1208 case SNatIn{+lo, +hi} x q:
1209 nat_in_defect(lo, hi, x, q)
1210 case SStrLen{+lo, +hi, +s2} +x +q:
1211 pick_why(conforms(~rule, s2, x, prev), rule_defect(len_err(lo, hi, x), q), defect(~rule, s2, x, prev, q))
1212 case SListLen{+lo, +hi, +s2} +r +q:
1213 # The count came first in check, so the count's own error is the one
1214 # reported here exactly when there was one to report -- for a list out of
1215 # bounds and for a value that is not a list at all (list_len_ok is False
1216 # for both, and count_err reported something for both).
1217 pick_why(Bool.not(list_len_ok(lo, hi, r)), rule_defect(count_err(lo, hi, r), q), defect(~rule, s2, r, None{}, q))
1218 case SOpt{inner} RNull{} q:
1219 None{}
1220 case SOpt{inner} x q:
1221 defect(~rule, inner, x, None{}, q)
1222 case SOptional{inner} RMissing{} q:
1223 None{} # absent is not wrong, at this path or below it
1224 case SOptional{inner} x q:
1225 defect(~rule, inner, x, None{}, q)
1226 case SList{e} RNil{} q:
1227 None{}
1228 case SList{e} RCons{h, t} AtIndex{0n} <> q:
1229 defect(~rule, e, h, None{}, q)
1230 case SList{+e} RCons{h, t} AtIndex{1n+j} <> q:
1231 guard(conforms(~rule, e, h, None{}), defect(~rule, SList{e}, t, None{}, AtIndex{j} <> q))
1232 case SList{+e} RCons{h, t} q:
1233 guard(conforms(~rule, e, h, None{}), defect(~rule, SList{e}, t, None{}, q))
1234 case SList{e} x q:
1235 not_list(x, q)
1236 case SField{+name, fs, rest} REnd{} AtField{0n, n} <> q:
1237 guard(String.eq(n, name), defect(~rule, fs, RMissing{}, None{}, q))
1238 case SField{+name, fs, rest} REnd{} AtField{1n+k, n} <> q:
1239 guard(conforms(~rule, fs, RMissing{}, None{}), defect(~rule, rest, REnd{}, None{}, AtField{k, n} <> q))
1240 case SField{+name, fs, rest} REnd{} q:
1241 guard(conforms(~rule, fs, RMissing{}, None{}), defect(~rule, rest, REnd{}, None{}, q))
1242 case SField{+name, fs, rest} RKey{+k, +v, +o} AtField{0n, n} <> +q:
1243 pick_why(Bool.not(key_once(name, RKey{k, v, o})), at_end(RepeatedKey{name}, q), guard(String.eq(n, name), defect(~rule, fs, lookup(name, RKey{k, v, o}), None{}, q)))
1244 case SField{+name, fs, rest} RKey{+k, +v, +o} AtField{1n+j, n} <> q:
1245 guard(conforms(~rule, fs, lookup(name, RKey{k, v, o}), None{}), defect(~rule, rest, RKey{k, v, o}, None{}, AtField{j, n} <> q))
1246 case SField{+name, fs, rest} RKey{+k, +v, +o} q:
1247 guard(conforms(~rule, fs, lookup(name, RKey{k, v, o}), None{}), defect(~rule, rest, RKey{k, v, o}, None{}, q))
1248 case SField{name, fs, rest} x q:
1249 not_object(x, q)
1250 case SEnd{} REnd{} q:
1251 None{}
1252 case SEnd{} RKey{k, v, o} q:
1253 None{}
1254 case SEnd{} x q:
1255 not_object(x, q)
1256 case SRule{+s2, +tag} +x +q:
1257 pick_why(conforms(~rule, s2, x, prev), rule_defect(rule(tag, x), q), defect(~rule, s2, x, prev, q))
1258 case SStrict{+s2} +x +q:
1259 pick_why(conforms(~rule, s2, x, prev), extra_defect(key_names(s2), x, q), defect(~rule, s2, x, prev, q))
1260 case STagged{+k, +n, cs, rest} +x +q:
1261 pick_why(is_tag(k, n, x), first_why(tag_key_defect(Bool.not(key_once(k, x)), k, q), defect(~rule, cs, drop_key(k, x), None{}, q)), defect(~rule, rest, x, None{}, q))
1262 case STagEnd{k} x q:
1263 tag_defect(k, x, q)
1264 case SBool{} x q:
1265 bool_defect(x, q)
1266 case STrue{} x q:
1267 true_defect(x, q)
1268 case SEnum{names} x q:
1269 enum_defect(names, x, q)
1270 case SVariant{+name, +vs, +rest} REnd{} AtField{1n+j, n} <> q:
1271 defect(~rule, rest, REnd{}, None{}, AtField{j, n} <> q)
1272 case SVariant{+name, +vs, +rest} REnd{} q:
1273 defect(~rule, rest, REnd{}, None{}, q)
1274 case SVariant{+name, +vs, +rest} RKey{+k, +v, +o} AtField{0n, +n} <> +q:
1275 pick_why(is_missing(lookup(name, RKey{k, v, o})), defect(~rule, rest, RKey{k, v, o}, None{}, AtField{0n, n} <> q), pick_why(Bool.not(key_once(name, RKey{k, v, o})), at_end(RepeatedKey{name}, q), guard(String.eq(n, name), defect(~rule, vs, lookup(name, RKey{k, v, o}), None{}, q))))
1276 case SVariant{+name, +vs, +rest} RKey{+k, +v, +o} AtField{1n+j, +n} <> +q:
1277 pick_why(is_missing(lookup(name, RKey{k, v, o})), defect(~rule, rest, RKey{k, v, o}, None{}, AtField{j, n} <> q), guard(conforms(~rule, vs, lookup(name, RKey{k, v, o}), None{}), dup_defect(rest, RKey{k, v, o}, AtField{j, n} <> q)))
1278 case SVariant{+name, +vs, +rest} RKey{+k, +v, +o} +q:
1279 pick_why(is_missing(lookup(name, RKey{k, v, o})), defect(~rule, rest, RKey{k, v, o}, None{}, q), None{})
1280 case SVariant{+name, +vs, +rest} x q:
1281 not_object(x, q)
1282 case SVEnd{} REnd{} q:
1283 no_variant(q)
1284 case SVEnd{} RKey{k, v, o} q:
1285 no_variant(q)
1286 case SVEnd{} x q:
1287 not_object(x, q)
1288 case STuple{ts, rest} RCons{h, t} AtIndex{0n} <> q:
1289 defect(~rule, ts, h, None{}, q)
1290 case STuple{+ts, rest} RCons{h, t} AtIndex{1n+j} <> q:
1291 guard(conforms(~rule, ts, h, None{}), defect(~rule, rest, t, None{}, AtIndex{j} <> q))
1292 case STuple{+ts, rest} RCons{h, t} q:
1293 guard(conforms(~rule, ts, h, None{}), defect(~rule, rest, t, None{}, q))
1294 case STuple{ts, rest} RNil{} q:
1295 at_end(TooShort{}, q)
1296 case STuple{ts, rest} x q:
1297 not_list(x, q)
1298 case STEnd{} RNil{} q:
1299 None{}
1300 case STEnd{} RCons{h, t} q:
1301 at_end(TooLong{}, q)
1302 case STEnd{} x q:
1303 not_list(x, q)
1304 case SEither{+l, +r} +x +q:
1305 pick_why(has_kind(l, kind_of(x)), defect(~rule, l, x, prev, q), pick_why(has_kind(r, kind_of(x)), defect(~rule, r, x, prev, q), at_end(missing_or(x, no_alt(SEither{l, r})), q)))
Uses (45)
Used by (0)
No other definition uses this definition.