Add our general macros
This commit is contained in:
81
iac/src/main/utils/general.clj
Normal file
81
iac/src/main/utils/general.clj
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
(ns utils.general
|
||||||
|
(:require
|
||||||
|
[clojure.walk]))
|
||||||
|
|
||||||
|
(defmacro build-registry
|
||||||
|
"Generates a flat resource registry map from a nested provider definition map."
|
||||||
|
[definitions]
|
||||||
|
(let [map-entries
|
||||||
|
(reduce-kv
|
||||||
|
(fn [entries provider-group-kw provider-group-def]
|
||||||
|
(let [{:keys [root-sym provider-key resources]} provider-group-def
|
||||||
|
provider-ns (name provider-group-kw)]
|
||||||
|
(reduce-kv
|
||||||
|
(fn [entries resource-kw resource-def]
|
||||||
|
(let [{:keys [path defaults-fn defaults-name]} resource-def
|
||||||
|
resource-name (name resource-kw)
|
||||||
|
final-key (keyword provider-ns resource-name)
|
||||||
|
constructor-form (list* '.. root-sym path)
|
||||||
|
defaults-fn-form
|
||||||
|
(cond
|
||||||
|
defaults-fn defaults-fn
|
||||||
|
defaults-name (let [defaults-fn-sym (symbol "default" (name defaults-name))]
|
||||||
|
`(fn [env] (~defaults-fn-sym (:options env))))
|
||||||
|
:else (let [defaults-fn-sym (symbol "default" resource-name)]
|
||||||
|
`(fn [env] (~defaults-fn-sym (:options env)))))
|
||||||
|
value-map `{:constructor ~constructor-form
|
||||||
|
:provider-key ~provider-key
|
||||||
|
:defaults-fn ~defaults-fn-form}]
|
||||||
|
(conj entries [final-key value-map])))
|
||||||
|
entries
|
||||||
|
resources)))
|
||||||
|
[]
|
||||||
|
definitions)]
|
||||||
|
`~(into {} map-entries)))
|
||||||
|
|
||||||
|
|
||||||
|
(defn- p->-replace-percent
|
||||||
|
"Walks 'form' and replaces all instances of the symbol '%'
|
||||||
|
with the value of 'x'."
|
||||||
|
[form x]
|
||||||
|
(clojure.walk/postwalk
|
||||||
|
(fn [sub-form]
|
||||||
|
(if (= sub-form '%) x sub-form))
|
||||||
|
form))
|
||||||
|
|
||||||
|
(defmacro pulet
|
||||||
|
"Sequential binding for Pulumi Outputs.
|
||||||
|
Looks like let*, but each binding is chained."
|
||||||
|
[bindings & body]
|
||||||
|
(if (empty? bindings)
|
||||||
|
`(do ~@body)
|
||||||
|
(let [[sym val & rest] bindings]
|
||||||
|
`(p-chain ~val
|
||||||
|
(fn [~sym]
|
||||||
|
(pulet [~@rest] ~@body))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(defmacro p-> [x & forms]
|
||||||
|
(let [wrap (fn [acc form]
|
||||||
|
(cond
|
||||||
|
(map? form)
|
||||||
|
`(p-chain ~acc (fn [val#] ~form))
|
||||||
|
|
||||||
|
(keyword? form)
|
||||||
|
`(p-chain ~acc #(get % ~form))
|
||||||
|
|
||||||
|
(string? form)
|
||||||
|
`(p-chain ~acc #(aget % ~form))
|
||||||
|
|
||||||
|
(symbol? form)
|
||||||
|
`(p-chain ~acc #(~form %))
|
||||||
|
|
||||||
|
(list? form)
|
||||||
|
`(p-chain ~acc (fn [val#] (~@form val#)))
|
||||||
|
|
||||||
|
:else
|
||||||
|
(throw (ex-info "Unsupported form in p->" {:form form}))))]
|
||||||
|
(reduce wrap x forms)))
|
||||||
|
|
||||||
Reference in New Issue
Block a user