Oops, some corrections to my original post. On Monday, May 8, 2017 at 11:38:34 AM UTC-4, Dave Tenny wrote: > > 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 this which lets you specify which fields you > want retrieved: > > (s/fdef get-selective-jobs > :args (s/cat :db database-handle? :fields (s/coll-of #{:job-id :job-name > :job-status})) > :ret (s/coll-of (s/keys :opt-un [ ::job-id ::job-name ::job-status ])))
^^ correction of :fields above, additiobn of :ret > (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/coll-of (set > job-field-keys)) > :ret (s/coll-of (s/keys* :opt-un job-field-keys))) ^^ correction to :args above, addition of :ret > 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. > The point being that it's be nice to have some easier ways of specifying similar but different sets of data in s/keys, s/cat, s/coll-of, and possibly other macros. > > 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.