Last active
February 20, 2016 10:32
-
-
Save SerCeMan/905ee46db26ee38e7201 to your computer and use it in GitHub Desktop.
nREPL with default NS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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