donut.system tutorial
This tutorial guides you through the basics of using donut.system to structure
and interact with your application. By the end of it you’ll be comfortable
creating and using systems, component groups, components, signal handlers, and
references. You’ll understand exactly what’s going on in this example:
dev/donut/examples/tutorial/04_environment_configuration.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| (ns donut.examples.tutorial.04-environment-configuration
(:require
[aero.core :as aero]
[clojure.java.io :as io]
[donut.system :as ds]))
(defn env-config [& [profile]]
(aero/read-config (io/resource "config/env.edn")
(when profile {:profile profile})))
(def DataStoreComponent
{::ds/start (fn [_] (atom nil))})
(def APIPollerComponent
{::ds/start (fn [{:keys [::ds/config]}]
(let [{:keys [data-store source]} config]
(future (loop [i 0]
(println (str "polling " source))
(reset! data-store i)
(Thread/sleep (:interval config))
(recur (inc i))))))
::ds/stop (fn [{:keys [::ds/instance]}]
(future-cancel instance))
::ds/config {:interval (ds/ref [:env :api-poller :interval])
:source (ds/ref [:env :api-poller :source])
:data-store (ds/ref [:services :data-store])}})
(def base-system
{::ds/defs
{:env {}
:services {:api-poller APIPollerComponent
:data-store DataStoreComponent}}})
(defmethod ds/named-system :base
[_]
base-system)
(defmethod ds/named-system :dev
[_]
(ds/system :base {[:env] (env-config :dev)}))
(defmethod ds/named-system :prod
[_]
(ds/system :base {[:env] (env-config :prod)}))
|
The tutorial assumes that you know basic Clojure, and that you have an
understanding of Clojure projects
and how to add libraries to your dependencies. See the donut.system Clojars
page for specific dependency info.
You can view all source for tutorial examples on
GitHub.
You can run these examples from a REPL.
OK enough jibber jabber! Let’s go!