Я пытаюсь соответствовать следующие последовательности с использованием радужный/Schema:Необязательный элемент в последовательности
[{:n "some text"}] ; => valid
и
[{:k "some text"} {:n "some text"}] ; => valid
То, что я пробовал:
(s/def Elem3
{:k s/Str})
(s/def Elem2
{:n s/Str})
(s/def Elem
[(s/optional Elem2 "elem2") Elem3])
(s/validate Elem [{:k "huji"}])
;; =>
;; Value does not match schema: [(named {:n missing-required-key, :k
;; disallowed-key} "elem2")]
(s/def Elem
[(s/maybe Elem2) Elem3])
(s/validate Elem [{:k "huji"}])
;; =>
;; [(maybe {:n Str}) {:k java.lang.String}] is not a valid sequence
;; schema; a valid sequence schema consists of zero or more `one`
;; elements, followed by zero or more `optional` elements, followed by
;; an optional schema that will match the remaining elements.
(s/defrecord ElemOption1
[elem3 :- Elem3])
(s/defrecord ElemOption2
[elem2 :- Elem2
elem3 :- Elem3])
(s/def Elem
(s/conditional
#(= 2 (count %)) ElemOption2
:else ElemOption1))
(s/validate Elem [{:k "huji"}])
;; =>
;; Value does not match schema: (not (instance?
;; peg_dsl.standard_app.ElemOption1 [{:k "huji"}]))
Основная проблема что я не понимаю, каков способ написать схему , которая позволяет опустить первый элемент указанный вектор. Каков правильный способ сопоставления обоих векторов сверху?
Что я ожидал сделать в моей первой попытки схемы, чтобы сказать: «Я ожидаю последовательность, состоящую из необязательно {: нс/Str} с последующим a {: ks/Str}. Когда я проверяю [{: k "huji"}], я вижу, что {: ns/Str} нет, но затем идет {: ks/Str}, все в порядке! " – foki