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 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/groups/opt_out.