2016-07-17 29 views
4

I coerce eine Karte Wert wie folgt:Clojure spec coerce verschachtelt Karte Wert

(require '[clojure.spec :as s]) 

(defn x-integer? [x] 
    (cond 
    (integer? x) x 
    (string? x) (try 
        (Integer/parseInt x) 
        (catch Exception e 
        :clojure.spec/invalid)) 
    :else :clojure.spec/invalid)) 

(s/def ::port (s/conformer x-integer?)) 

(s/def ::config (s/keys :req [::port])) 

(s/conform ::config {::port "12345"}) ;;=> #:my.ns{:port "12345"} 

aber ich sehe nicht, wie ich mit der folgenden Karte das gleiche tun könnte stattdessen:

(s/conform ::config {::nested-data {:port "12345"}}) ;;=> something like that maybe ? #:my.ns/nested-data{:port 12345} 

Wie sollte ::config definiert werden? Wäre es auch vorzuziehen, stattdessen {::nested-data {::port "12345"}} zu haben?

+1

Es sieht aus wie Sie fehlen eine :: Port-Spezifikation, die x-Integer verwendet? Dieses Beispiel scheint unvollständig zu sein. –

+0

@AlexMiller Sie haben Recht, Frage bearbeitet. – nha

Antwort

7
(s/def ::port (s/conformer x-integer?)) 
(s/def ::nested-data (s/keys :req-un [::port])) 
(s/def ::config (s/keys :req [::nested-data])) 
(s/conform ::config {::nested-data {:port "12345"}}) 
;;=> #:spec.examples.guide{:nested-data {:port 12345}}