2016-12-28 3 views
0

Я настраиваю конфигурационную карту, используя environ для извлечения переменных env. Поскольку окружать нормализует верхний регистр в нижний регистр и «_» символы «-», я закончил с повторами ключевых словизбегая повторения при объявлении карт

(def config {:consumer-key (env :consumer-key) 
      :keystore-password (env :consumer-key) 
      :ssl-keystore-password (env :ssl-keystore-password) 
      :ssl-certificate-name (env :ssl-certificate-name) 
      :callback-url (env :callback-url) 
      :mp-private-key (env :mp-private-key) 
      :merchant-checkout-id (env :merchant-checkout-id) 
      :is-sandbox (env :is-sandbox)}) 

есть способ предотвратить это повторение? возможно, функция, которая получает ключевое слово и возвращает некоторую пару ключевых значений для карты?

+3

Не могли бы вы использовать ['select-keys'] (http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/select-keys) для создания карты' config'? – glts

ответ

3

Как уже упоминалось в комментариях, так как env это карта, вы можете просто использовать select-keys со списком ключей для копирования:

(def config 
    (select-keys env [:consumer-key :is-sandbox 
        :keystore-password :ssl-keystore-password :ssl-certificate-name 
        :callback-url :mp-private-key :merchant-checkout-id])) 
подход

Алан Томпсон является разумным, если у вас есть произвольная функция, а не конкретно карта.

+0

Поскольку он использует библиотеку 'environ', тогда' env' действительно является функцией: https://github.com/weavejester/environ#usage –

+0

Если я правильно помню, это действительно карта. «Позволяет извлекать данные о соединении с базой данных: ключ базы данных на карте environment.core/env». (Из документов) .. так что ответ @ amalloy должен быть правильным – leetwinski

+0

Это определенно карта: https://github.com/weavejester/environ/blob/master/environ/src/environ/core.clj#L39 – amalloy

0

Вот один из способов сделать это путем определения вспомогательной функции:

(def env {:consumer-key 1 
      :ssl-key  2 
      :mp-private-key 3}) 

(def key-list (keys env)) 

(defn extract-from 
    [src-fn keys] 
    (into (sorted-map) 
    (for [key keys] 
     {key (src-fn key)}))) 

(println "result:" (extract-from env key-list)) 

=> result: {:consumer-key 1, :mp-private-key 3, :ssl-key 2} 

Обратите внимание, что для целей тестирования я использовал трюк и заменил картуenv для функцииenv из библиотеки environ. Это работает, так как карта может действовать как функция при поиске ее ключей. Он по-прежнему будет работать для фактической функции, например, environ.core/env.

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