- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 GraphQL 架构语法的一部分定义规范。这是从 API 返回的字段类型的样子(请注意:ofType 可以无限嵌套):
{:kind "NON_NULL",
:name nil,
:ofType {:kind "LIST",
:name nil,
:ofType {:kind "NON_NULL",
:name nil,
:ofType {:kind "OBJECT", :name "Comment"}}}}
目前我有一个这样的规范来表示这个结构:
(spec/def ::kind #{"NON_NULL" "LIST" "SCALAR" "OBJECT"})
(spec/def ::name (spec/nilable string?))
(spec/def ::ofType (spec/or :terminal nil?
:type ::type))
(spec/def ::type
(spec/keys :req-un [::name ::kind ::ofType]))
这是一个不错的解决方案,但有一些不变量我还没有弄清楚如何捕获:
:name
在除最深(终端)级别之外的所有级别都必须为 nil。:kind
只能在终端级别等于 SCALAR
或 OBJECT
。:kind
必须在终端级别等于SCALAR
或OBJECT
。:kind
不能在两个连续级别中等于 NON_NULL
。是否可以在规范中捕获这些规则?或者,如果没有,是否可以编写一个遵守这些规则的自定义生成器?
更新 - 生成器解决方案
我能够为此构建一个生成器。请参阅下面 Rulle 的回答,了解如何直接对此进行规范。
(spec/def ::kind #{"NON_NULL" "LIST" "SCALAR" "OBJECT"})
(spec/def ::name (spec/nilable string?))
(spec/def ::ofType (spec/or :terminal nil?
:type ::type))
(spec/def ::type
(spec/keys :req-un [::name ::kind ::ofType]))
(spec/def ::terminal-kind #{"SCALAR" "OBJECT"})
(spec/def ::terminal-name string?)
(def terminal-gen
"Returns a generator for a terminal field type.
Terminal field types are either of :kind 'OBJECT' or 'SCALAR', have an :ofType of nil, and a non-nil :name."
(gen/bind
(spec/gen (spec/tuple ::terminal-name ::terminal-kind))
(fn [[name kind]]
(gen/hash-map
:name (spec/gen #{name})
:kind (spec/gen #{kind})
:ofType (gen/return nil)))))
(defn build-type-gen
"Returns a generator which constructs a field type data structure.
An example of a field type:
{ :name nil,
:kind 'NON_NULL',
:ofType {:name nil, <-- a 'modifier layer', these can be infinitely nested
:kind 'LIST',
:ofType {:name nil,
:kind 'LIST',
:ofType {:name 'M17Pyn0zClVD', :kind 'OBJECT', :ofType nil}}}}} <-- Terminal field type
This function works by creating a terminal type generator, then 'wrapping' it with layer generators (NON NULL and LIST)
until it's a given depth. The following constraints are ensured through the process:
1. :name must be nil at all levels except the deepest (terminal) level.
2. :kind can only equal SCALAR or OBJECT at the terminal level.
3. :kind must equal either SCALAR or OBJECT at the terminal level.
4. :kind cannot equal NON_NULL in two consecutive levels."
([max-depth] (if (= max-depth 1) terminal-gen
(build-type-gen max-depth 0 terminal-gen)))
([max-depth curr-depth inner-gen]
(if (< curr-depth max-depth)
(recur max-depth
(inc curr-depth)
(gen/bind inner-gen
(fn [inner-gen]
(if (= "NON_NULL" (:kind inner-gen))
(gen/hash-map
:name (gen/return nil)
:kind (spec/gen #{"LIST"}) ; two NON_NULLs cannot be child-parent
:ofType (spec/gen #{inner-gen}))
(gen/hash-map
:name (gen/return nil)
:kind (spec/gen #{"NON_NULL" "LIST"})
:ofType (spec/gen #{inner-gen}))))))
inner-gen)))
(def type-gen (gen/bind (spec/gen (spec/int-in 1 5)) build-type-gen))
例子:
(gen/generate type-gen)
=>
{:name nil,
:kind "LIST",
:ofType {:name nil,
:kind "LIST",
:ofType {:name nil,
:kind "NON_NULL",
:ofType {:name nil, :kind "LIST", :ofType {:name "KmgbOsy", :kind "SCALAR", :ofType nil}}}}}
最佳答案
您可以将它分成 inner 和 outer ofType
变体,如下所示:
(spec/def :inner/name nil?)
(spec/def :inner/kind #{"NON_NULL" "LIST" "SCALAR" "OBJECT"})
(spec/def :inner/ofType (spec/or :inner ::inner
:outer ::outer))
(spec/def ::inner (spec/keys :req-un [:inner/name :inner/kind :inner/ofType]))
(spec/def :outer/name (spec/nilable string?))
(spec/def :outer/kind #{"SCALAR" "OBJECT"})
(spec/def :outer/ofType nil?)
(spec/def ::outer (spec/keys :req-un [:outer/name :outer/kind] :opt-un [:outer/ofType]))
(spec/def ::ofType (spec/or :terminal nil?
:inner ::inner
:outer ::outer))
最后一个条件,即两个 NON_NULL
不能相互跟随,可以单独处理。请注意,当稍后在规范中使用时,此函数将收到 conformed 值:
(defn kinds-ok? [of-type]
(->> (second of-type)
(iterate (comp second :ofType))
(map :kind)
(take-while some?)
(partition 2 1)
(some #{["NON_NULL" "NON_NULL"]})
not))
然后我们用这个额外的条件创建一个顶级规范:
(spec/def ::top (spec/and ::ofType kinds-ok?))
kinds-ok?
将接收一致值而不是原始值这一事实在某种程度上令人惊讶,甚至是令人讨厌的规范方面。但这就是它的设计方式。我不确定如何让它接收原始值:如果有人知道,请随时提出建议。
关于clojure - 嵌套级别之间具有相互依赖值的 map 规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66271188/
我们有一个 Java 项目,每天晚上使用 TeamCity 对 Java 类进行静态分析,以查找代码中容易出现的错误。我们想告诉 TeamCity 寻找开发人员可能引入的与 == 与 .equals
Promises/A+ 这是一个开放标准,旨在让不同开发者实现的 JavaScript Promise 能够无缝衔接并应用——由前辈们制定,为其他后来者提供参考 一个 promise 所
前言 🍊缘由 Git分支管理好,走到哪里都是宝 🏀事情起因: 最近翻看博客中小伙伴评论时,发现文章【规范】看看人家Git提交描述,那叫一个规矩一条回复: 本狗亲测在我司中使用规范
使用带有不存在的命名空间的命名空间限定关键字来定义规范是否被认为是不好的做法?我想在公共(public) domain 命名空间中定义实体映射...所以为了避免在合并规范时丢失数据,我使用约定 :en
有没有办法在调用 clojure.spec.test.alpha/check 时覆盖核心谓词函数的生成器? 可以通过 s/gen 中的路径覆盖谓词生成器: (gen/generate (s/gen
以内核 rpm 为例,它允许在一个系统上同时安装多个版本。规范文件中究竟是什么允许的? 我想打包一个已经存在的具有不同安装前缀的多个版本的项目。 最佳答案 百胜 找到了让 yum 安装而不是更新的方法
我正在尝试用 C# 编写 PDF 解析器,但我遇到了一个问题,我不确定如何解释规范。 除非另有说明,否则 PDF 文档中的用户空间为 1/72 英寸(即 1pt)。 Tf 运算符提供的比例将字体从标准
我正在编写一些代码,需要能够获取两个 pdf 并将它们附加到页面级别(例如,如果它们都是 2 页文档,则有一个 4 页文档,其中所有 4 页都与原始文档相同). 在不使用库的情况下,最好的方法是什么?
是否有序言语言语法,或接近它的通常用作引用的东西?我正在使用 SWI-prolog,所以有一个适合这种风格的会很好,否则一般的 prolog 语言语法/规范也能工作。 最佳答案 自 1995 年起,P
我需要一个函数来过滤参数和构建查询。我有 4 个参数,因此如果我尝试为每个条件实现查询,我将不得不写 16 (2^4)实现 - 这不是一个好主意。 我尝试使用界面改进我的代码 Specificatio
这个 ExtGState 对象对图像做了什么: > 我有 PDF 规范,但一点也不清楚。显然,这将身份函数(什么的身份?单位矩阵?)从 [0.0 1.0] 映射到 [0.0 1.0](相同),这是没有
只是想获得有关 ePub 规范的一些帮助。toc.ncx 是否必须具有 src(即 xhtml)。我观察到 .opf 文件中也提供了相同的内容 src。 最佳答案 是的,这是强制性的,这是一个设计问题
让我们看看莱宁根项目 map 的真实示例 :global-vars : ;; Sets the values of global vars within Clojure. This example
我正在开发一个 LOB 框架,它具有 SL 和 MVC 前端、WCF 后端以及在服务器上运行的几个服务模块。我一直在查看 Spec#,看它是否对我有任何帮助。不可空类型和检查异常本身非常好,但我还没有
Promises/A+规范是最小的规范之一。因此,实现它是理解它的最佳方法。福布斯·林德赛(Forbes Lindesay)的以下回答将引导我们完成实现Promises / A +规范Basic Ja
哪个文档指定了 MySQL definer 格式? 具体来说,definer admin@% 中的 % 是什么意思(以及为什么使用这个符号)? 最佳答案 这里MySQL使用的格式定义在the MySQ
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
在 css 规范中,什么会影响更多的 inline 样式或外部 !important 外部“style.css”: #di{color: green!important;} div 文本颜色是红色还
我正在努力思考 CSS 的一些细节,我从 W3 CSS Visual Formatting Spec 9.2.2 中找到了这部分摘录。特别迟钝: Inline-level boxes that are
这个问题在这里已经有了答案: Are (non-void) self-closing tags valid in HTML5? (8 个答案) 关闭 9 年前。 在 HTML5 中你应该使用 或
我是一名优秀的程序员,十分优秀!