2017-06-21 64 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