Skip to content
/ sys Public

A boring dependency injection system for Clojure(Script) apps.

Notifications You must be signed in to change notification settings

rafd/sys

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sys

Clojars Project

A boring dependency injection system for Clojure(Script) apps.

  • Ordered startup and shutdown of components based on declared dependencies.
  • Validates expects and provides for each component (optionally also checking types using malli schemas).
  • Resumes startup/shutdown from failure points.
(ns my-app.core
  (:require
    [sys.api :as sys]))

(def config-component
  {:sys.component/id       :config
   :sys.component/expects  #{}
   :sys.component/provides #{:db-url :http-port}
   :sys.component/start    (fn [_]
                             ;; use your favorite config library
                             {:db-url "jdbc://..."
                              :http-port 8080})})

(def db-component
  {:sys.component/id       :db
   ;; can use malli-lite schemas:
   :sys.component/expects  {:db-url [:re "^jdbc://.*"]}
   :sys.component/provides #{:db-conn}
   :sys.component/start    (fn [{:keys [db-url]}]
                              {:db-conn (db/conn db-url)})
   :sys.component/stop     (fn [{:keys [db-conn]}]
                              (db/close db-conn))})

(def http-server-component
  #:sys.component
  {:id       :component-2
   :expects  #{:http-port}
   :provides #{:server}
   :start    (fn [{:keys [http-port]}]
               {:server (http/start http-port)})
   :stop     (fn [{:keys [server]}]
               (http/stop server))})

(def prod-system
  (sys/init!
    [db-component
     config-component
     http-server-component]))

(defn -main
  [& _]
  (sys/start! prod-system)
  (.addShutdownHook
   (Runtime/getRuntime)
   (Thread. #(sys/stop! prod-system)))
  @(promise))

(comment
 (sys/start! prod-system)

 (sys/context @prod-system)
 ;; {:db-conn ... :db-url ... :http-port ...}

 (sys/get @prod-system :http-port)
 ;; 8080

 (sys/stop! prod-system))

Want a prod and dev system? Create two lists of components. Or, one list that filters out some things from the other. No helpers for this at the moment, it's up to you.

See test/sys/test/e2e.clj for a more complete example.

See test/sys/test/api.clj for a test namespaces that walks through all the features.

About

A boring dependency injection system for Clojure(Script) apps.

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •