/pr/ – programming


909c5909c5a5fee1346159c97b93bb2285e8c – ``json validation''

@101ddc569a294f7298a369ba99c815ea Anonymous 2020-06-20 11:43:54
Считаю, что нужно создать новый способ валидации json. json schema и прочее - какое-то ужасное говно. Надо придумать что-то новое. Придумываем ITT.
Чего мне не хватает, например, так это параметризации схем, т.е. дженериков.
@972dc22504fa48f9a686fd2fce829d70 Anonymous 2020-06-21 13:33:31
Думаю это всё надо реализовать как какой-то специфический язык. Нужно начать с базовых вещей, которые должны быть в этом языке. Думаю лучше всё делать на основе предикатов: Json -> bool и функциий, которые возвращают предикаты.
Базовые предикаты:
is_int, is_float, is_bool, is_str, is_array, is_obj.
Дальше, все литералы json делаем литералами этого языка.
Будут ещё:
eq : Json -> Json -> bool
or и and.
is_number = or is_int is_float
is_null = eq null
@7567cf3cf65949c9b038eedb500db63f Anonymous 2020-06-21 18:09:24
Добавим логические операции: && || !.
Тогда and и or можно было через них выразить (но это не важно):
or p1 p2 j = || (p1 j) (p2 j)
not p j = ! (p j)
one_of p1 p2 j = or (and p1 (not p2)) (and (not p1) p2)
Добавим операции с числами: + * / %.
multiple_of n j = && (is_number j) (eq (% j n) 0)
Для чисел пусть будут lt, gt т.е. < и >.
lte x = or (lt x) (eq x)
gte x = or (gt x) (eq x)
Т.о. покрыли всё из numeric, boolean, null и combining
Ладно, и так понятно, что всё что есть в убогой json-schema можно с лёгкостью выразить.
А дженерики тоже легко выражаются просто за счёт использования HOF.