/
activities.clj
68 lines (58 loc) · 2.11 KB
/
activities.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(ns stepwise.activities
(:refer-clojure :exclude [ensure compile])
(:require [clojure.walk :as walk]
[stepwise.arns :as arns]
[stepwise.interceptors.core :as interceptors]
[stepwise.model :as mdl]
[stepwise.client :as client])
(:import (clojure.lang MapEntry)))
(defn resource-entry? [node]
(and (instance? MapEntry node)
(#{::mdl/resource :resource} (key node))))
(defn get-names [definition]
(into #{}
(comp (filter resource-entry?)
(filter #(keyword? (val %)))
(map val))
(tree-seq #(or (map? %) (vector? %))
identity
definition)))
(defn resolve-resources [old->new definition]
(walk/prewalk (fn [node]
(if (resource-entry? node)
(MapEntry. (key node) (old->new (val node)))
node))
definition))
(defn resolve-kw-resources [old->new definition]
(resolve-resources (fn [resource-name]
(if (keyword? resource-name)
(old->new resource-name)
resource-name))
definition))
(defn ensure [kw-name]
(client/create-activity (arns/make-name kw-name)))
(defn ensure-all [activity-names]
(into {}
(map (fn [activity-name]
[activity-name (ensure activity-name)]))
activity-names))
(defn compile [handler]
(if (fn? handler)
handler
(interceptors/compile
(vec (:interceptors handler))
(get handler
:handler-fn
identity))))
(defn compile-all [activity->handler]
(into {}
(map (fn [[activity handler]]
[activity (compile handler)]))
activity->handler))
(defn invoke [activity->handler activity-name input]
(if (contains? activity->handler activity-name)
(let [compiled (compile (get activity->handler activity-name))]
(compiled input (fn [])))
(throw (ex-info "Activity name missing in handler map"
{:activity-name activity-name
:handled-keys (set (keys activity->handler))}))))