Skip to content

Instantly share code, notes, and snippets.

@darkleaf
Last active August 19, 2024 18:33
Show Gist options
  • Save darkleaf/d5f8869b47a1a2688b05e154cbf40c42 to your computer and use it in GitHub Desktop.
Save darkleaf/d5f8869b47a1a2688b05e154cbf40c42 to your computer and use it in GitHub Desktop.
(ns example.core
(:require
[darkleaf.di.core :as di])
(:import
(io.helidon.http Method)
(io.helidon.http.sse SseEvent)
(io.helidon.webserver WebServer WebServerConfig$Builder)
(io.helidon.webserver.http
HttpRouting$Builder Handler
ServerRequest ServerResponse)
(io.helidon.webserver.sse SseSink)
(java.util.function Consumer)))
(set! *warn-on-reflection* true)
(defmacro ..*
"form => fieldName-symbol or (instanceMethodName-symbol args*)
Expands into a member access (.) of the first member on the first
argument, followed by the next member on the result, etc. For
instance:
(.. System (getProperties) (get \"os.name\"))
expands to:
(. (. System (getProperties)) (get \"os.name\"))
but is easier to write, read, and understand."
{:added "1.0"}
([x form]
;; подумать как лучше сделать
(let [tag (-> form meta :tag)]
(cond-> `(. ~x ~form)
(some? tag) (with-meta {:tag tag}))))
([x form & more]
`(..* (..* ~x ~form) ~@more)))
(defn server
{::di/stop WebServer/.stop
::di/kind :component}
[{^Consumer routing `routing}]
(..* WebServer
builder
^WebServerConfig$Builder
(port 8080)
^WebServerConfig$Builder
(routing routing)
(build)
(start)))
(defn ->handler ^Handler [f]
(reify Handler
(handle [_ req res]
(f req res))))
(defn routing [{root `root} ^HttpRouting$Builder it]
(.. it
(route Method/GET (->handler root))))
(defn root [-deps ^ServerRequest req ^ServerResponse res]
(with-open [sseSink (.. res (sink SseSink/TYPE))]
(dotimes [i 10]
(Thread/sleep 1000)
(.. sseSink (emit (SseEvent/create (str "hello " i)))))))
#_
(.. Thread
ofVirtual
(start (fn []
(Thread/sleep 3000)
(.. res (send "Hello World 4 !")))))
(comment
(def system (di/start `server))
(di/stop system)
(require '[clojure.repl.deps :as repl.deps])
(repl.deps/sync-deps)
,,,)
{:paths ["src"]
:deps {org.clojure/clojure {:mvn/version "1.12.0-rc1"}
org.clojars.darkleaf/di {:mvn/version "3.0.0"}
io.helidon.webserver/helidon-webserver {:mvn/version "4.1.0"}
io.helidon.webserver/helidon-webserver-sse {:mvn/version "4.1.0"}
#_#_
squint/squint {:git/url "https://github.com/squint-cljs/squint"
:git/sha "d453309a565ab6a02592ca4a7f88bad5c82b34a5"}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment