Skip to content

BrianChevalier/nano.system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

nano.system

Orchestrate your stateful Clojure system

Installation

nano.system can be installed by using git deps. Add this to your deps.edn

io.github.BrianChevalier/nano.system {:git/tag "v1.0.0" :git/sha ""}

Usage

Define your components with regular functions and maps. :start/:stop should be functions that take the current state of the system and return a new state map. In your namespace, define your components.

(ns my.server.namespace
  (:require [ring.adapter.jetty :as jetty]))

(defn start-handler [system]
  (assoc system 
         ::handler 
         (fn [req] 
           {:status 200
            :body   "Hello, world!"})))

(def handler-component
  {:name ::handler
   :start #'start-handler})

(defn start-server [state]
  (let [handler (::handler state)
        config {:port (::port state) :join? false}
        server (jetty/run-jetty handler config)])
  (assoc state ::server server))

(defn stop-server [state]
  (when-let [server (::server state)]
    (.stop server))
  (dissoc state ::server))

(def server-component
  {:name  ::server
   :start #'start-server
   :stop  #'stop-server})

Now in your main namespace

(ns my.main.namespace
  (:require [my.server.namespace :as server]
            [nano.system]))

(defonce state 
  (atom {:components [server/handler-component
                      server/server-component]}))

Finally, we can use nano to start and stop the system.

(nano.system/start   state)
(nano.system/stop    state)
(nano.system/restart state)

About

Orchestrate your stateful Clojure system

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published