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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.