|
| 1 | +(ns integrant.repl |
| 2 | + (:require [integrant.core :as ig] |
| 3 | + [integrant.repl.state :as state] |
| 4 | + #?(:clj [clojure.tools.namespace.repl :as repl]))) |
| 5 | + |
| 6 | +#?(:clj (repl/disable-reload! (find-ns 'integrant.core))) |
| 7 | + |
| 8 | +(defn set-prep! [prep] |
| 9 | + #?(:clj (alter-var-root #'state/preparer (constantly prep)) |
| 10 | + :cljs (set! state/preparer prep))) |
| 11 | + |
| 12 | +#?(:clj (defn error [s] (Error. s)) |
| 13 | + :cljs (defn error [s] (js/Error. s)) ) |
| 14 | + |
| 15 | +(defn- prep-error [] |
| 16 | + (error "No system preparer function found.")) |
| 17 | + |
| 18 | +(defn prep [] |
| 19 | + (if-let [prep state/preparer] |
| 20 | + (do #?(:clj (alter-var-root #'state/config (fn [_] (prep))) |
| 21 | + :cljs (set! state/config (prep))) |
| 22 | + :prepped) |
| 23 | + (throw (prep-error)))) |
| 24 | + |
| 25 | +(defn- halt-system [system] |
| 26 | + (when system (ig/halt! system))) |
| 27 | + |
| 28 | +(defn- build-system [build wrap-ex] |
| 29 | + (try |
| 30 | + (build) |
| 31 | + (catch #?(:clj clojure.lang.ExceptionInfo |
| 32 | + :cljs ExceptionInfo) ex |
| 33 | + (if-let [system (:system (ex-data ex))] |
| 34 | + (try |
| 35 | + (ig/halt! system) |
| 36 | + (catch #?(:clj clojure.lang.ExceptionInfo |
| 37 | + :cljs ExceptionInfo) |
| 38 | + halt-ex |
| 39 | + (throw (wrap-ex ex halt-ex))))) |
| 40 | + (throw ex)))) |
| 41 | + |
| 42 | +(defn- init-system [config keys] |
| 43 | + (build-system |
| 44 | + (if keys |
| 45 | + #(ig/init config keys) |
| 46 | + #(ig/init config)) |
| 47 | + #(ex-info "Config failed to init; also failed to halt failed system" |
| 48 | + {:init-exception %1} |
| 49 | + %2))) |
| 50 | + |
| 51 | +(defn- resume-system [config system] |
| 52 | + (build-system |
| 53 | + #(ig/resume config system) |
| 54 | + #(ex-info "Config failed to resume; also failed to halt failed system" |
| 55 | + {:resume-exception %1} |
| 56 | + %2))) |
| 57 | + |
| 58 | +(defn init |
| 59 | + ([] (init nil)) |
| 60 | + ([keys] |
| 61 | + #?(:clj (alter-var-root #'state/system (fn [sys] |
| 62 | + (halt-system sys) |
| 63 | + (init-system state/config keys))) |
| 64 | + :cljs (set! state/system (do (halt-system state/system) |
| 65 | + (init-system state/config keys)))) |
| 66 | + :initiated)) |
| 67 | + |
| 68 | +(defn go |
| 69 | + ([] (go nil)) |
| 70 | + ([keys] |
| 71 | + (prep) |
| 72 | + (init keys))) |
| 73 | + |
| 74 | +(defn clear [] |
| 75 | + #?(:clj (do (alter-var-root #'state/system (fn [sys] (halt-system sys) nil)) |
| 76 | + (alter-var-root #'state/config (constantly nil))) |
| 77 | + :cljs (do (set! state/system (do (halt-system state/system) nil)) |
| 78 | + (set! state/config nil))) |
| 79 | + :cleared) |
| 80 | + |
| 81 | +(defn halt [] |
| 82 | + (halt-system state/system) |
| 83 | + #?(:clj (alter-var-root #'state/system (constantly nil)) |
| 84 | + :cljs (set! state/system nil)) |
| 85 | + :halted) |
| 86 | + |
| 87 | +(defn suspend [] |
| 88 | + (when state/system (ig/suspend! state/system)) |
| 89 | + :suspended) |
| 90 | + |
| 91 | +(defn resume [] |
| 92 | + (if-let [prep state/preparer] |
| 93 | + (let [cfg (prep)] |
| 94 | + #?(:clj (do (alter-var-root #'state/config (constantly cfg)) |
| 95 | + (alter-var-root #'state/system (fn [sys] |
| 96 | + (if sys |
| 97 | + (resume-system cfg sys) |
| 98 | + (init-system cfg nil))))) |
| 99 | + :cljs (do (set! state/config cfg) |
| 100 | + (set! state/system (if state/system |
| 101 | + (resume-system cfg state/system) |
| 102 | + (init-system cfg nil))))) |
| 103 | + :resumed) |
| 104 | + (throw (prep-error)))) |
| 105 | + |
| 106 | +(defn reset [] |
| 107 | + (suspend) |
| 108 | + #?(:clj (repl/refresh :after 'integrant.repl/resume) |
| 109 | + :cljs (integrant.repl/resume))) |
| 110 | + |
| 111 | + |
| 112 | +(defn reset-all [] |
| 113 | + (suspend) |
| 114 | + #?(:clj (repl/refresh-all :after 'integrant.repl/resume) |
| 115 | + :cljs (integrant.repl/resume))) |
0 commit comments