# 规范元数据支持
问题:目前没有将元数据附加到规范的方法
能够添加文档字符串(主要用例)会很好
或者在不同上下文中使用该规范的有用信息
(静态代码分析器、自定义转换/强制转换、它与特定数据库架构的关系、可读性错误消息
模板、领域特定关注点或甚至稍后 clj.spec 本身,等等)。
理论上,人们可以今天创建自己的元数据注册表并
在库级别处理此事,一些特定于规范的
项目已经这样做了,但有一个统一/标准的方式
来做这一点会更好。默认情况下,最好首先添加文档字符串
支持。它可以采取以下两种形式之一
至少以下两种
(s/def ::foo "这是一个 foo" any?)
(s/def ::foo string? {:doc "这是一个 foo" :cassandra-type :varchar})
;; 根据实现可能还有这些
(s/spec #() :gen ... :meta ...)
(with-meta (s/spec ...))
有几种方法可以实现这一点,各有优劣
* 实现 IMeta 协议
这似乎是干净的方法,元数据将在任何规范级别受到支持
(例如非注册的规范谓词、集合规范等)。虽然实现将需要
对现有代码进行相当多的更改,但这主要是添加一个元数据参数到
各种*-spec-impl 宏和在 `s/def` 及其衍生的级别。
那个方法的棘手之处在于注册的规范
引用另一个规范仅是一个“链接”(一个关键字),因此我们
现在无处添加元数据。
它们可以具体化,返回对原始规范的“指针”,并在自己的级别
保持元数据。
它们可以在自己的级别保持元数据。
这种做法很直接,meta 数据将在任何规范级别得到支持。
* 使用简单的注册表(类似于规范注册表
或以某种方式集成到主规范注册表中)
基本上是一个 spec-kw -> meta 数据的映射,如果在一个单独的注册表中,
或者以某种方式集成到主注册表中。
这是简单的做法,只支持注册的规范,将元数据与其他内容
分开,会使规范实例稍微轻一些。引用其他规范的规范也可以有自己的元数据。
如前所述,这可以在单独的注册表中完成或在主要规范注册表
中的规范值中完成。
IMeta 似乎可能是更好的解决方案,我们会利用现有的“meta” api。