2017-06-21 58 views
0

我想接受參數看起來像這樣的命令:clojure core.tools.cli:如何覆蓋布爾選項?

--enable-boolean-flag --disable-boolean-flag --enable-boolean-flag 

在由clojure.tools.cli/parse-opts返回:options關鍵,我想有:boolean-flag選項設置爲true,如果--enable-boolean-flag選項排在最後的命令行和如果--disable-boolean-flag在命令行上最後一個出現,則返回false,如果這是有道理的。

任何想法?

編輯:我使用0.338的core.tools.cli庫。

回答

1

您可以利用工具-cli允許您爲每個命令行選項指定的:id,:default:assoc-fn屬性來實現此目的。

  • 使用:id設置相同的ID爲「--enable」和「 - 禁用」選項
  • 上的一個選項使用:default指定要如果沒有「--enable」發生什麼或「--disable」被指定
  • 使用:assoc-fn指定該選項對選項圖有什麼影響。每次出現「--disable」時,您都希望將值設置爲false,並且每次出現--enable時都要true

全部放在一起:

(ns clis.core 
    (:require [clojure.tools.cli :refer [parse-opts]]) 
    (:gen-class)) 

(def cli-options 
    [["-e" "--enable" "Enable" 
    :default true 
    :id :boolean-flag 
    :assoc-fn (fn [m k _] (assoc m k true))] 
    ["-d" "--disable" "Disable" 
    :id :boolean-flag 
    :assoc-fn (fn [m k _] (assoc m k false))]]) 

(defn -main [& args] 
    (parse-opts args cli-options)) 

測試在REPL:

(-main) 
;; {:options {:boolean-flag true}, :arguments [], :summary " -e, --enable Enable\n -d, --disable Disable", :errors nil} 
(-main "-e" "-d" "-e") 
;; {:options {:boolean-flag true}, :arguments [], :summary " -e, --enable Enable\n -d, --disable Disable", :errors nil} 
(-main "-e" "-d" "-e" "-d") 
;; {:options {:boolean-flag false}, :arguments [], :summary " -e, --enable Enable\n -d, --disable Disable", :errors nil} 
+0

使用相同ID拋出一個錯誤,不是嗎?我認爲每個參數的ID必須是唯一的。 – djhaskin987

+0

情況並非如此。我包含的代碼作品。另請參閱[docstring for parse-opts](https://github.com/clojure/tools.cli/blob/master/src/main/clojure/clojure/tools/cli.clj#L498)。它特別指出,多個選項條目可以共享相同的':id' – ez121sl