Skip to content

Instantly share code, notes, and snippets.

@ayato-p

ayato-p/demo.clj Secret

Last active December 7, 2017 13:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ayato-p/668f78af41919218885f13f2212eb96a to your computer and use it in GitHub Desktop.
Save ayato-p/668f78af41919218885f13f2212eb96a to your computer and use it in GitHub Desktop.
(require
'[bidi.bidi :as bidi]
'[bidi.ring]
'[hiccup.core :as h]
'[integrant.core :as ig]
'[kuuga.growing :as k.growing]
'[kuuga.tool :as k.tool]
'[kuuga.ultimate :as k.ultimate]
'[ring.adapter.jetty :as jetty]
'[ring.middleware.keyword-params :as mw.keyword-params]
'[ring.middleware.nested-params :as mw.nested-params]
'[ring.middleware.params :as mw.params]
'[ring.util.response :as res])
(defonce +system+ (atom nil))
(defmethod ig/init-key :demo/server
[_ opts]
(->> (select-keys opts [:host :port :join?])
(jetty/run-jetty (or (:handler opts) identity))))
(defmethod ig/halt-key! :demo/server
[_ server]
(.stop server))
(def routes
["/" {:get :handler/get-handler
:post :handler/post-handler}])
(defmulti handler-resolver identity)
(alter-var-root #'mw.keyword-params/keyword-syntax? (fn [v] (constantly true)))
(defmethod ig/init-key :demo/endpoint
[_ _]
(-> (bidi.ring/make-handler routes handler-resolver)
mw.keyword-params/wrap-keyword-params
mw.nested-params/wrap-nested-params
mw.params/wrap-params))
(def system-config
{:demo/endpoint {}
:demo/server {:port 3000
:join? false
:handler (ig/ref :demo/endpoint)}})
(defn start []
(when-not @+system+
(reset! +system+ (ig/init system-config)))
:started)
(defn stop []
(when @+system+ (ig/halt! @+system+))
(reset! +system+ nil)
:stoped)
;;; ---
(defmethod k.growing/transform-by-tag :input
[_ _ tagvec]
(let [[tag tagopts contents] (k.tool/parse-tag-vector tagvec)]
`[~tag
(update ~tagopts :name #(if (keyword? %) (subs (str %) 1) %))
~@contents]))
(def view
(h/html
(k.ultimate/transform*
[:form {:method :post}
[:div
[:label "アリス:出身地"]
[:input {:name :alice/hometown}]]
[:div
[:label "アリス:年齢"]
[:input {:name :alice/age}]]
[:div
[:label "ボブ:出身地"]
[:input {:name :bob/hometown}]]
[:div
[:label "ボブ:年齢"]
[:input {:name :bob/age}]]
[:button {:type :submit} "submit"]])))
(defn get-handler [req]
(-> view
res/response
(res/content-type "text/html; charset=utf8")))
(defmethod handler-resolver :handler/get-handler
[_]
get-handler)
(defn post-handler [req]
(-> (:params req)
pr-str
res/response
(res/content-type "text/plain; charset=utf8")))
(defmethod handler-resolver :handler/post-handler
[_]
post-handler)
(defproject demo "0.1.0-SNAPSHOT"
:dependencies [[ayato_p/kuuga "0.1.1"]
[bidi "2.1.2" :exclusions [ring/ring-core]]
[hiccup "2.0.0-alpha1"]
[integrant "0.6.1"]
[org.clojure/clojure "1.9.0-RC2"]
[ring "1.6.3"]])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment