一連のルートとハンドラーを備えた構成アプリがあります。
(defroutes app-routes
(GET "/stuff/:id" [:as request] (stuff/get-stuff request))
(POST "/stuff/" [:as request] (stuff/create-stuff request))
各ハンドラーは、次のように入力を検証します
(defn create-stuff
[request]
(my-validation/validate-request
request
my-validation/create-stuff-validator
stuff-ok-fn))
検証コードは Metis に基づいており、次のようになります。
(metis/defvalidator :create-stuff-validator
[:db :presence])
(defn validate-request
[request request-validator ok-function]
(let [validation-result (request-validator request)]
(if (empty? validation-result)
(ok-function request)
(bad-request validation-result))))
私の問題は、create-stuff のコードが各ルート ハンドラ間で重複していることです。つまり、get-stuff 関数は create-stuff ハンドラのように見えます。唯一の違いは、バリデーター機能と、検証がうまくいった機能です。
慣用的な Clojure の方法でこの重複を抽象化するにはどうすればよいですか?