77 lines
1.7 KiB
Clojure
77 lines
1.7 KiB
Clojure
(ns user
|
|
(:require [clojure.tools.namespace.repl :as repl]
|
|
[clojure.tools.logging :as log]
|
|
[mount.core :as mount]
|
|
[hawk.core :as hawk]))
|
|
|
|
;; Only reload spiceflow namespaces
|
|
(repl/set-refresh-dirs "src")
|
|
|
|
(defonce watcher (atom nil))
|
|
|
|
(defn start
|
|
"Start the application."
|
|
[]
|
|
(require 'spiceflow.core)
|
|
((resolve 'spiceflow.core/-main)))
|
|
|
|
(defn stop
|
|
"Stop the application."
|
|
[]
|
|
(mount/stop))
|
|
|
|
(defn reset
|
|
"Stop, reload all changed namespaces, and restart."
|
|
[]
|
|
(stop)
|
|
(repl/refresh :after 'user/start))
|
|
|
|
(defn reload
|
|
"Reload all changed namespaces without restarting."
|
|
[]
|
|
(repl/refresh))
|
|
|
|
(defn reload-all
|
|
"Force reload all app namespaces."
|
|
[]
|
|
(stop)
|
|
(repl/refresh-all :after 'user/start))
|
|
|
|
(defn- clj-file? [_ {:keys [file]}]
|
|
(and file (.endsWith (.getName file) ".clj")))
|
|
|
|
(defn- on-file-change [_ _]
|
|
(log/info "File change detected, reloading namespaces...")
|
|
(log/info "Reloading workspaces...")
|
|
(try
|
|
(reset)
|
|
(log/info "Reload complete")
|
|
(catch Exception e
|
|
(log/error e "Reload failed"))))
|
|
|
|
(defn watch
|
|
"Start watching src directory for changes and auto-reload."
|
|
[]
|
|
(when @watcher
|
|
(hawk/stop! @watcher))
|
|
(reset! watcher
|
|
(hawk/watch! [{:paths ["src"]
|
|
:filter clj-file?
|
|
:handler on-file-change}]))
|
|
(log/info "File watcher started - will auto-reload on .clj changes"))
|
|
|
|
(defn unwatch
|
|
"Stop the file watcher."
|
|
[]
|
|
(when @watcher
|
|
(hawk/stop! @watcher)
|
|
(reset! watcher nil)
|
|
(log/info "File watcher stopped")))
|
|
|
|
(defn go
|
|
"Start the app and enable auto-reload on file changes."
|
|
[]
|
|
(start)
|
|
(watch)
|
|
:ready)
|