проверить схему с ключом и значением, используя плюматическую схему
Я пытаюсь выполнить проверку значения ключа в векторе с использованием plumatic-schema, но сообщение об ошибке для меня непонятно, вот что я пытаюсь сделать:
;validating array with maps, it works
(s/validate [{}] [{} {}])
=> [{} {}]
;validating array with key and map (any lenght), not work
(s/validate [s/Int {}] [0 {} 1 {}])
[Int {}] 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/defn example [items :- [(s/one s/Int "i") (s/one {} "v")]] ...)
;the call should be valid for cases like this
(example [0 {} 1 {} 2 {} 3 {}])
(example [0 {}])
1 ответ
См. Эти документы:
Вот код, показывающий, как это работает:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require
[schema.core :as s]))
(dotest
(is= [{} {}]
(spyx (s/validate
[{}]
[{} {}])))
(is= [0 {}]
(s/validate
[(s/one s/Int "int-1")
(s/one {} "map-2")]
[0 {}]))
(is= [0 {} 1 {}]
(s/validate
[(s/one s/Int "int-1")
(s/one {} "map-2")
(s/one s/Int "int-3")
(s/one {} "map-4")]
[0 {} 1 {}])) )
Если вы хотите проверить произвольную длину чередующихся int и map, вам, возможно, придется проделать небольшую подготовительную работу:
(defn validate-alternate-int-and-map
[some-seq]
(let [pairs (partition 2 some-seq)
all-int (mapv first pairs)
all-map (mapv second pairs)]
(assert (= (count all-map)
(count all-int)))
(s/validate [s/Int] all-int)
(s/validate [{}] all-map)
some-seq))
(dotest
(is= [0 {}] (validate-alternate-int-and-map [0 {}]))
(is= [0 {} 1 {}] (validate-alternate-int-and-map [0 {} 1 {}]))
(is= [0 {} 1 {} 2 {}] (validate-alternate-int-and-map [0 {} 1 {} 2 {}]))
)
PS
У меня также есть несколько предопределенных схем (например, KeyMap
, Pair
и т. д.), которые я считаю очень удобными в пространстве имен tupelo.schema.