2016-12-28 8 views
0

env変数をフェッチするためにenvironを使用して設定マップを設定しています。 環境を小文字に大文字を正規化し、「_」文字にするので、「 - 」、私はキーワードマップを宣言している間に繰り返しを避ける

(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

地図。

+0

彼は 'environ'ライブラリを使用しているので、' env'は本当に関数です:https://github.com/weavejester/environ#usage –

+0

私が正しく覚えていれば、それは本当にマップです。 "environ.core/envマップのdatabase-urlキーからデータベース接続の詳細を取得できます。 (docsから).. 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のような実際の機能のために働くでしょう。あなたは、任意の機能を持っているのではなく、具体的場合

(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])) 

アラン・トンプソンのアプローチが妥当である:envはあなただけコピーするキーのリストをselect-keysを使用することができますマップであることから、コメントで述べたように

関連する問題