65 lines
1.9 KiB
Clojure
65 lines
1.9 KiB
Clojure
(ns cat.core
|
|
(:require [cat.handler :as handler]
|
|
[cat.nrepl :as nrepl]
|
|
[luminus.http-server :as http]
|
|
[luminus-migrations.core :as migrations]
|
|
[cat.config :refer [env]]
|
|
[clojure.tools.cli :refer [parse-opts]]
|
|
[clojure.tools.logging :as log]
|
|
[mount.core :as mount])
|
|
(:gen-class))
|
|
|
|
(def cli-options
|
|
[["-p" "--port PORT" "Port number"
|
|
:parse-fn #(Integer/parseInt %)]])
|
|
|
|
(mount/defstate ^{:on-reload :noop} http-server
|
|
:start
|
|
(http/start
|
|
(-> env
|
|
(assoc :handler #'handler/app)
|
|
(update :io-threads #(or % (* 2 (.availableProcessors (Runtime/getRuntime)))))
|
|
(update :port #(or (-> env :options :port) %))))
|
|
:stop
|
|
(http/stop http-server))
|
|
|
|
(mount/defstate ^{:on-reload :noop} repl-server
|
|
:start
|
|
(when (env :nrepl-port)
|
|
(nrepl/start {:bind (env :nrepl-bind)
|
|
:port (env :nrepl-port)}))
|
|
:stop
|
|
(when repl-server
|
|
(nrepl/stop repl-server)))
|
|
|
|
(defn stop-app []
|
|
(doseq [component (:stopped (mount/stop))]
|
|
(log/debug component "stopped"))
|
|
(shutdown-agents))
|
|
|
|
(defn start-app [args]
|
|
(doseq [component (-> args
|
|
(parse-opts cli-options)
|
|
mount/start-with-args
|
|
:started)]
|
|
(log/info component "started"))
|
|
(.addShutdownHook (Runtime/getRuntime) (Thread. stop-app)))
|
|
|
|
(defn -main [& args]
|
|
(mount/start #'cat.config/env)
|
|
(cond
|
|
(nil? (:database-url env))
|
|
(do
|
|
(log/error "Database configuration not found, :database-url environment variable must be set before running")
|
|
(System/exit 1))
|
|
(some #{"init"} args)
|
|
(do
|
|
(migrations/init (select-keys env [:database-url :init-script]))
|
|
(System/exit 0))
|
|
(migrations/migration? args)
|
|
(do
|
|
(migrations/migrate args (select-keys env [:database-url]))
|
|
(System/exit 0))
|
|
:else
|
|
(start-app args)))
|