从Clojure中的默认注册表将关键字解析为Malli模式



如何从默认Malli注册表将关键字解析为架构?我似乎无法在注册表中查找值来遍历它。

(def registry
(atom {}))
(defn register! [type ?schema]
(swap! registry assoc type ?schema))
;; Combine the default registry with our own mutable registry.
(mreg/set-default-registry!
(mreg/composite-registry
(mreg/fast-registry (malli/default-schemas))
(mreg/mutable-registry registry)))
(register! :db/kasse
[:map
[:id                            [:int {:primary-key true :db-generated true}]]
[:odlingsplats                  [:string {:foreign-key "odlingsplatser"}]]
[:diameter_m                    :int]
[:djup_m                        :int]
[:volym_m2                      [:int {:db-generated true}]]])
(malli/walk
:db/kasse
(malli/schema-walker identity))
;; => :db/kasse

我尝试过用malli的不同函数包装:db/kasse,但似乎没有一个能完成查找,而且malli/-lookup是私有的。仅仅运行(:db/kasse malli/default-registry)也不起作用。使用malli/schema似乎是一个显而易见的选择,但似乎没有任何效果。

(malli/walk
(malli/schema :db/kasse)
(malli/schema-walker identity))
;; => :db/kasse

调用malli/deref就是答案:

(malli/walk
(malli/deref :db/kasse)
(malli/schema-walker identity))
;; => [:map [:id [:int {:primary-key true, :db-generated true}]] [:odlingsplats [:postgres/string {:foreign-key "odli
ngsplatser"}]] [:diameter_m :int] [:djup_m :int] [:volym_m2 [:int {:db-generated true}]] [:namn {:optional true} [:po
stgres/string {:db-generated true}]]] 

感谢Clojurians slack的ikitommi提供的答案。他还解释了图书馆为什么会这样运作:

返回的:db/casse是一个MalliSchema实例,它的打印输出只是表单,所以看起来像关键字。它的类型是:malli.core/schema,这是内部的热切引用,就像Clojure中的Var一样。如果你想得到它背后的架构,你可以对它进行m/deref。但是,在db/casse上调用m/validate也可以。:malli.core/schema将调用转发到实际实例,如Var.

最新更新