macro woes

25 views
Skip to first unread message

Dimitrios Jim Piliouras

unread,
Feb 24, 2022, 11:28:36 AM2/24/22
to ClojureScript
Hello everyone,

I'm trying to implement a rudimentary feature-flagging system in CLJS, and as you might expect, I want to emit different code when a particular feature is enabled VS disabled. So this is how I started:
```
(ns app.features
(:require [clojure.string :as str]))

(goog-define features "")

(def CURRENT (into #{} (map keyword) (str/split features #",")))
```
I now want to define a simple macro like the following:
```
(defmacro with-feature 
   [id enabled disabled]
   (if (contains? app.features/CURRENT id)
     (when (some? enabled) `~enabled)
     (when (some? disabled) `~disabled)
))
```
Where do I put this macro so that the compiler doesn't complain that `app.features/CURRENT` cannot be resolved? I know it has to be a .clj file, but I am unable to require cljs namespaces from clj. I can make the whole thing work, if I emit the entire `if` expression from the macro (i.e. backtick the `if` expression), but if possible I'd like to avoid doing that check at runtime, simply because everything I need to make the decision is a compile-time constant. Here are two examples of how i want to call it (from various namespaces):
```
;; in this case enabling the feature adds code, so there is no `disabled` expression
(features/with-feature :keycloak
   (rf/dispatch-sync [::keycloak.events/connect  app.config/keycloak])
   nil)

;; in this case disabling the feature adds code so there is no `enabled` expression
(features/with-feature :keycloak
   nil
   (rf/reg-event-fx ::sign-out-button-clicked
      (fn [{:keys [db]} _]
         (-> (auth-db/get-session db)
               (auth-api/sign-out)))))

```
Is that at all possible? Any help whatsoever is greatly appreciated - many thanks in advance...

Dimitrios
Reply all
Reply to author
Forward
0 new messages