2015-01-13 4 views
1

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

Как я могу это достичь?

ответ

7

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

Смежные вопросы