clojure的Schema中至少有一个可选键

Ale*_*lin 6 validation schema input clojure

假设我从外部世界收到一些输入,我有以下架构:

(def my-schema
  {(s/optional-key :foo) Bool
   (s/optional-key :baz) Bool
   (s/optional-key :bar) Bool})
Run Code Online (Sandbox Code Playgroud)

有了上述内容,我正在验证的地图中可能存在或缺少所有键或没有键,这是有道理的.但是,如果我想确保其中至少有一个存在,该怎么办?

在Schema验证了上述内容后,我当然可以执行额外的单独检查,并确保密钥计数> = 1,但我很好奇是否有一种方法可以在Schema定义中强制执行.

思考?

Dan*_*ero 3

您可以在模式中指定您想要的任何谓词:

(def my-schema
  (s/both
     (s/pred (complement empty) 'not-empty)
     {(s/optional-key :foo) Bool
      (s/optional-key :baz) Bool
      (s/optional-key :bar) Bool}))
Run Code Online (Sandbox Code Playgroud)

如果您询问如何仅使用内置谓词来验证地图,您可以编写:

(def my-schema
  (s/both
     {(s/optional-key :foo) Bool
      (s/optional-key :baz) Bool
      (s/optional-key :bar) Bool}
     (s/either
      {:foo Bool s/Any s/Any}
      {:baz Bool s/Any s/Any}
      {:bar Bool s/Any s/Any})))
Run Code Online (Sandbox Code Playgroud)

pred这非常丑陋,而且比示例更冗长

  • 有条件的最好方法是什么? (3认同)