Функции вызова, прочитанные из файлов 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, чтобы они не могли выполнять какие-либо функции в рабочей среде, которые вы не хотите, чтобы они имели доступ к.