Hey Jarrod,
Whenever I find myself writing out steps, like you just did, I like to use
a method described by Stuart Sierra,
pipelines<http://stuartsierra.com/2012/05/16/syntactic-pipelines>.
In your case, I'd write something like this:
(defn make-api-call!
[{:keys [db-entity] :as state}]
(let [result (client/post "https://cool-api.com/entity"
{:form-params {:x 42 :y (:id db-entity) ...}})
status (:status result)]
(assoc state :api-result result
:api-call-successful? (<= 200 status 299))))
(defn write-response!
[{:keys [api-result] :as state}]
(let [file ...]
(spit file (:body api-result))
(assoc state :api-result-file file)))
(defn update-db-entity!
[{:keys [db-entity] :as state}]
(let [updated-db-entity (...)]
(assoc state :db-entity updated-db-entity)))
(defn process-api-result!
[{:keys [api-call-successful?] :as state}]
(-> state
(update-db-entity!)
(cond->
api-call-successful? (write-response!))))
(defn api-call-pipeline!
[db-entity]
(-> {:db-entity db-entity}
(make-api-call!)
(process-api-result!)
;; do whatever you want with the state, for now return the entity and
the result file
(select-keys [:db-entity :api-result-file])))
In this example you'd just call api-call-pipeline! with the database
entity. This lets you test each of these steps in isolation. Hope that
helps!
Shaun
On Monday, February 10, 2014 3:07:22 PM UTC-7, Jarrod Swart wrote:
>
> I'm having a hard time coming up with a satisfactory way to implement the
> following:
>
>
> 1. Call an API with a map from the DB containing various endpoint data
> like URL, etc.
> 2. If the response has an HTTP 200, update the map-from-db and then
> write response body to a file.
> 3. If step 2 yields a HTTP > 2xx, update the map-from-db but do not
> write file
>
> Because this is mostly imperative it feels "icky" in Clojure. I would
> just call the api query function mapped across them all, but I am making
> many API requests and writing many files. It seemed better to attempt them
> one at a time. Is this wrong-headed?
>
> Suggestions?
>
>
--
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/groups/opt_out.