Skip to content

Instantly share code, notes, and snippets.

@vvvvalvalval
Last active May 18, 2023 18:17
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vvvvalvalval/d31f8980045f3da3b3415092f6db32b6 to your computer and use it in GitHub Desktop.
Save vvvvalvalval/d31f8980045f3da3b3415092f6db32b6 to your computer and use it in GitHub Desktop.
Clojure : keywordize values at specific keys
(ns utils.keywordize-at-keys
(:require [clojure.walk :as walk]))
(defn- coerced-to-keyword
[k]
(when (string? k)
(keyword k)))
(defn keywordize-at-keys
"Coerces String values to keyword at specific keys in a nested data structure.
Given:
- `enum-typed-keys`: a Set of keys
- `x`: a (potentially nested) data structure
Replaces any Map entry [k v] where k is in `enum-typed-keys`
so that v gets transformed to a Keyword."
[enum-typed-keys x]
(walk/postwalk
(fn [e]
(or
(and
(map-entry? e)
(let [[k v] e]
(when (contains? enum-typed-keys k)
(when-some [v1 (coerced-to-keyword v)]
[k v1]))))
e))
x))
(comment
(def my-enum-typed-keys
#{:banking.transaction/type
:banking.transaction/currency})
(keywordize-at-keys
my-enum-typed-keys
{:my
{:banking
{:transactions
[{:banking.transaction/id "dkjlsfjsdl"
:banking.transaction/type "banking_tx_debit"
:banking.transaction/currency "EUR"
:banking.transaction/amount 1899}
{:banking.transaction/id "fdlsfjss"
:banking.transaction/type "banking_tx_credit"
:banking.transaction/currency "USD"
:banking.transaction/amount 8488}]}}})
=>
{:my
{:banking
{:transactions
[#:banking.transaction{:id "dkjlsfjsdl",
:type :banking_tx_debit,
:currency :EUR,
:amount 1899}
#:banking.transaction{:id "fdlsfjss",
:type :banking_tx_credit,
:currency :USD,
:amount 8488}]}}}
*e)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment