Использование clojure.spec для карты

У меня есть следующая карта:

(def gigs {:gig-01 {:id :gig-01
                    :title "Macaron"
                    :artist "Baher Khairy"
                    :desc "Sweet meringue-based rhythms with smooth and sweet injections of soul"
                    :img "https://res.cloudinary.com/schae/image/upload/f_auto,q_auto/v1519552695/giggin/baher-khairy-97645.jpg"
                    :price 1000
                    :sold-out false}
           :gig-02 {:id :gig-02
                    :title "Stairs"
                    :artist "Brentr De Ranter"
                    :desc "Stairs to the highets peaks of music."
                    :img "https://res.cloudinary.com/schae/image/upload/f_auto,q_auto/v1519552695/giggin/brent-de-ranter-426248.jpg"
                    :price 2000
                    :sold-out false}})

Я хотел бы создать для него спецификацию, но я не уверен, как определить ключ, например. ":gig-01" какие-нибудь указатели?


person jwesonga    schedule 15.04.2019    source источник


Ответы (1)


Вы можете попробовать:

(s/def ::gig-id
   (s/and keyword?
          (fn [x] (->> x name (re-matches #"gig-\d+")))))
person akond    schedule 15.04.2019
comment
Будет ли тогда полная спецификация? (s/def ::id string?) (s/def ::title string?) (s/def ::artist string?) (s/def ::desc string?) (s/def ::img string?) (s/def ::price int?) (s/def ::sold-out boolean?) (s/def ::gig (s/keys :req-un [::id ::title ::artist ::desc ::img ::price ::sold-out])) (s/def ::gig-id (s/and keyword? (fn [x] (->> x name (re-matches #"gig-\d+"))))) (s/def ::gigs (s/and (s/map-of ::gig-id ::gig))) (s/def ::db (s/keys :req-un [::gigs])) @akond - person jwesonga; 15.04.2019
comment
::db не надо, можно ::gigs, но да, как-то так. - person akond; 15.04.2019
comment
И я чувствую, что вы имели в виду (s/def ::id ::gig-id) - person akond; 15.04.2019