Функции вызова, прочитанные из файлов EDN

У меня есть файл конфигурации EDN, в котором записи относятся к существующим функциям, например:

:attribute-modules {:content {:class lohan.extractors.content/process}
                    :schema  {:class lohan.extractors.schema/process}
                    :label   {:class lohan.extractors.label/process}
                    :user    {:class lohan.extractors.user/process}
                    :env     {:class lohan.extractors.env/process}}

Используя clojure.edn / read-edn, эти записи читаются как символы, но я хочу иметь возможность вызывать их во время выполнения. Цель этого состоит в том, чтобы предоставить пользователю возможность предоставлять свой собственный набор функций.

Как мне этого добиться?

1 ответ

Решение

Вы можете вызвать функцию из переменной var, на которую ссылается Symbol, используя resolve,

Например, если вы хотите вызвать + используя его символ, вы можете использовать:

((resolve '+) 1 2)
;=> 3

Поэтому, используя ваш пример, вы можете сделать:

((resolve (get-in  (clojure.edn/read-string "{:content {:class ohan.extractors.content/process}
                                              :schema  {:class lohan.extractors.schema/process}
                                              :label   {:class lohan.extractors.label/process}
                                              :user    {:class lohan.extractors.user/process}
                                              :env     {:class lohan.extractors.env/process}}")
                   [:content :class])))

Вам нужно будет либо ограничить набор разрешенных символов, доступных пользователям, либо иметь высокий уровень доверия к пользователям, которые предоставляют edn, чтобы они не могли выполнять какие-либо функции в рабочей среде, которые вы не хотите, чтобы они имели доступ к.

Другие вопросы по тегам