Let's say I have a namespace that provides access to the database, say our table has these fields (as clojure specs)
(s/def ::job-id nat-int?) ; 1 2 3 ... (s/def ::job-name string?) ; frobozz-executor (s/def ::job-status keyword?) ; :queued, :in-progress, :completed And that I have the logic in place to convert to/from the types (e.g. keywords). If I have a simple function to return records in from the jobs table it might look like: (s/def ::job-record (s/keys :req-un [::job-id ::job-name ::job-status])) (s/fdef get-jobs :args (s/cat :db database-handle?) :ret (s/coll-of ::job-record)) (defn get-jobs [db] ... returns vector of maps, one for each record, jdbc-style ...) (get-jobs) => [{:job-id 1 :job-name "frobozz-executor" :job-status :queued} ...] Now here's where things get iffy in practice. Suppose I have other database interfaces that take similar but different maps or collections of keywords. For example, a function like: (s/fdef get-selective-jobs :args (s/cat :db database-handle? :fields (s/keys :opt-un [::job-id ::job-name ::job-status]))) (defn get-selective-jobs [db fields] ... return only fields from the database that are specified in the fields parameter ...) Once you start getting some similar-but-different specs, it'd be nice apply a bit of code building. e.g. (def job-field-keys [::job-id ::job-name ::job-status]) (s/def ::job-record (s/keys* :req-un job-field-keys)) (s/fdef get-selective-args :args (s/cat* :db database-handle? :fields (s/keys :opt-un job-field-keys)) Hopefully this is conducive to some thought/discussion of the subject, and/or someone can just let me know how I should be doing this if there's an easy way in the present spec implementation. Sidewise plea: inline specs for s/keys like you can do for s/cat. s/keys deliberate omision of inline specs does occasionally get in the way in large namespaces. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.