Skip to content

Instantly share code, notes, and snippets.

@SerCeMan
Last active February 20, 2016 10:32
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 SerCeMan/905ee46db26ee38e7201 to your computer and use it in GitHub Desktop.
Save SerCeMan/905ee46db26ee38e7201 to your computer and use it in GitHub Desktop.
nREPL with default NS
(ns com.nda.myproduct
(:require
[clojure.tools.nrepl.server :as server]
[clojure.tools.nrepl.middleware :as middleware]
[clojure.tools.nrepl.middleware.session :as session]))
; util funcs
;...
; repl
(defonce
nrepl-server
(do
(defn- wrap-init-vars
[init-ns]
(with-local-vars
[wrap-init-vars'
(fn [h]
;; this needs to be a var, since it's in the nREPL session
(with-local-vars [init-ns-sentinel nil]
(fn [{:keys [session] :as msg}]
(when-not (@session init-ns-sentinel)
(swap! session assoc
init-ns-sentinel true
(var *ns*) (try (require init-ns)
(create-ns init-ns)
(catch Throwable t
(.printStackTrace t)
(create-ns 'user)))))
(h msg))))]
(doto wrap-init-vars'
;; set-descriptor! currently nREPL only accepts a var
(middleware/set-descriptor!
{:requires #{#'session/session}
:expects #{"eval"}})
(alter-var-root (constantly @wrap-init-vars')))))
(defn start-server
[{:keys [init-ns] :as opts}]
(let [init-ns-mw [(wrap-init-vars init-ns)]
middleware (concat init-ns-mw server/default-middlewares)
handler (apply server/default-handler middleware)
opts (assoc opts :handler handler)]
(apply server/start-server (mapcat identity opts))))
(start-server {:init-ns 'com.nda.myproduct
:port 16872})))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment