New yada
This commit is contained in:
commit
0fc51a53b0
|
@ -0,0 +1 @@
|
|||
config.edn
|
|
@ -0,0 +1,5 @@
|
|||
#http://boot-clj.com
|
||||
#Sat Nov 16 01:10:28 PST 2019
|
||||
BOOT_CLOJURE_NAME=org.clojure/clojure
|
||||
BOOT_VERSION=2.8.3
|
||||
BOOT_CLOJURE_VERSION=1.10.1
|
|
@ -0,0 +1,42 @@
|
|||
(def project "redblackrose")
|
||||
(def version "0.0.1")
|
||||
|
||||
(set-env! :resource-paths #{"resources" "src"}
|
||||
:source-paths #{"src"}
|
||||
:dependencies '[[org.clojure/clojure "1.8.0"]
|
||||
[org.clojure/tools.nrepl "0.2.13"]
|
||||
[adzerk/boot-reload "0.5.2"]
|
||||
[aleph "0.4.3"]
|
||||
[yada "1.2.6"]
|
||||
[aero "1.1.2"]
|
||||
[prismatic/schema "1.1.7"]
|
||||
[com.taoensso/timbre "4.10.0"]]
|
||||
:jar {:main 'redblackrose.core}
|
||||
:aot {:all true})
|
||||
|
||||
(require '[aero.core :refer (read-config)])
|
||||
|
||||
(require '[redblackrose.core])
|
||||
|
||||
(def config
|
||||
(read-config "config.edn"))
|
||||
|
||||
(task-options!
|
||||
repl {:client true :port 5600})
|
||||
|
||||
(defn dev []
|
||||
(-> 'redblackrose.core/-main
|
||||
(resolve)
|
||||
(apply [])))
|
||||
|
||||
(defn start []
|
||||
(comp
|
||||
(speak)
|
||||
(dev)))
|
||||
|
||||
(deftask run
|
||||
[]
|
||||
(comp
|
||||
(repl :server true
|
||||
:port (get-in config [:webserver :port]))
|
||||
(start)))
|
|
@ -0,0 +1,63 @@
|
|||
(ns redblackrose.core
|
||||
(:require [schema.core :as s]
|
||||
[yada.yada :as yada]
|
||||
[taoensso.timbre :as timbre]))
|
||||
|
||||
(timbre/set-config! {:level :info})
|
||||
|
||||
(def server (atom nil))
|
||||
|
||||
(defn widget-resource
|
||||
[initial-value]
|
||||
"simple modifiable widget. look at yada.resources.atom-resource for ways to add
|
||||
last-modified headers and the like"
|
||||
(let [value (atom initial-value)]
|
||||
(yada/resource
|
||||
{:methods {:get {:produces "application/json"
|
||||
:response (fn [ctx] @value)}
|
||||
:post {:parameters {:body {:sprockets s/Num
|
||||
:reaction s/Str
|
||||
(s/optional-key :extras) s/Any}}
|
||||
:consumes "application/json"
|
||||
:response (fn [ctx]
|
||||
(let [body (get-in ctx [:parameters :body])]
|
||||
(reset! value body)))}}})))
|
||||
|
||||
(defn routes
|
||||
[]
|
||||
["/"
|
||||
{"hello" (yada/as-resource "hello from redblackrose")
|
||||
"json" (yada/as-resource {:message "yo! from redblackrose"})
|
||||
"modifiable-string" (yada/as-resource (atom "original value"))
|
||||
"widget" (widget-resource {:sprockets 3
|
||||
:reaction "wow"})
|
||||
"die" (yada/as-resource (fn []
|
||||
(future (Thread/sleep 100) (@server))
|
||||
"shutting down in 100ms..."))}])
|
||||
(defn run
|
||||
"Returns promise to capture lifecycle of server"
|
||||
[]
|
||||
(let [listener (yada/listener (routes) {:port 3000})
|
||||
done (promise)]
|
||||
(reset! server (fn []
|
||||
((:close listener))
|
||||
(deliver done :done)))
|
||||
done))
|
||||
|
||||
(defn -main
|
||||
[& args]
|
||||
(let [done (run)]
|
||||
(println "server running on port 3000... GET \"http://localhost:3000/die\" to kill")
|
||||
@done))
|
||||
|
||||
(comment
|
||||
"to run in a repl, eval this:"
|
||||
(def server-promise (run))
|
||||
"then either wait on the promise:"
|
||||
@server-promise
|
||||
"or with a timeout"
|
||||
(deref server-promise 1000 :timeout)
|
||||
"or close it yourself"
|
||||
(@server))
|
||||
|
||||
|
Loading…
Reference in New Issue