Fork me on GitHub
#malli
<
2020-11-23
>
ikitommi06:11:25

playing with :=> generators. also good peek at the syntax options (using children vs properties):

(def Age
  [:int {:min 18, :max 100}])

(def User
  [:map
   [:name string?]
   [:age Age]
   [:skills [:set [:enum "clj" "cljs" "rust" "go" "cobol"]]]])

;; option1: childs
(def create-user
  [:=> {:gen/=> '(fn [[age] user] (assoc user :age age))}
   [:tuple Age] User])

;; option2: properties
(def create-user
  [:=> {:gen/=> '(fn [[age] user] (assoc user :age age))
        :input [:tuple Age]
        :output User}])

(mg/generate User {:size 10})
; => {:name "Szf5sN", :age 21, :skills #{"cobol" "rust" "cljs" "clj" "go"}}

(def create-user-gen (mg/generate create-user {:size 10}))

(create-user-gen 46)
; => {:name "Itu96", :age 46, :skills #{"cobol" "rust" "cljs" "clj" "go"}}

👏 3
ikitommi21:11:26

also, validating functions against mallidefinitions:

(def Age
  [:int {:min 18, :max 100}])

(def User
  [:map
   [:name string?]
   [:age Age]
   [:skills [:set [:enum "clj" "cljs" "rust" "go" "cobol"]]]])

(mg/generate User {:size 10})
; => {:name "Szf5sN", :age 21, :skills #{"cobol" "rust" "cljs" "clj" "go"}}

(def create-user [:=> [:tuple Age] User])

(m/validate
  create-user
  (fn [age] {:name "elephant", :age age, :skills #{"cobol"}})
  {::m/=>validator mg/=>validator})
; => true

;; invalid return
(m/validate
  create-user
  (fn [age] {:name "elephant", :age age, :skills #{"PERL"}})
  {::m/=>validator mg/=>validator})
; => false

;; invalid arity
(m/validate
  create-user
  (fn [age _extra] {:name "elephant", :age age, :skills #{"cobol"}})
  {::m/=>validator mg/=>validator})
; => false

🔥 3