Fork me on GitHub
#re-frame
<
2021-07-04
>
Oliver George10:07:22

Are there any cute shortcuts for spec-ing re-frame event handler args? Typically I'm only interested in bits of what's passed and they are buried a few levels down. In this case I'd like to know the db has a :forms map, the location is a path string, route is a bidi map and resp is an anomaly or returned data containing the data I need.

[{:keys [db history/location]} [_ route resp]]

Oliver George10:07:36

I fall to (s/asserts...) at the top of the implementation for convenience but it'd be nice to use s/fdef if it didn't end up super verbose.

p-himik10:07:42

There's also :pre in Clojure, but it would probably be just as verbose.

vemv13:07:47

don't all the spec-related libs tackle this? orchestra, guardrails, speced.def (my creation; it's particularly handy for inlining specs) etc

ingesol08:07:13

Ah, @U45T93RA6, didn’t notice you already answered this. I’m using speced.def, find it to be a great fit for re-frame events and subs

ingesol08:07:25

primarily because of verbosity. There are many great libraries for specing functions, but I didn’t find any other that allows you to do something like this

(d/fn [{:keys [^::db-that-contains-form db]} [_ & ^::my-coll-spec args]]
    {:db (assoc db :something args)})

vemv11:07:05

Yes speced.def remains unique in destructuring support, and specing beyond defn (defprotocol, fn, let, etc) One thing that probably would be handy for cljs usage is failing asynchronously or in a custom manner so that the SPA won't fail irreversibly (as it can happen with :pre). I have related work in a branch, I simply haven't proceeded b/c I don't know much about who's using speced.def or their needs (and have my OSS plate quite full)

ingesol13:07:23

I can only speak for myself, but so far there hasn’t been a need for CLJS specific handling. The type errors I want to catch don’t happen much in the wild

👍 3
ingesol13:07:40

so mostly a dev tool for us, at least so far