我想要一个带有如下参数的命令:
--enable-boolean-flag --disable-boolean-flag --enable-boolean-flag
在:options
返回的clojure.tools.cli/parse-opts
密钥中,如果:boolean-flag
选项在命令行中排在最后,我希望--enable-boolean-flag
选项设置为true,如果--disable-boolean-flag
在命令行中排在最后,如果这有任何意义的话。
有什么想法吗?
编辑:我正在使用core.tools.cli
库的0.3.6。
答案 0 :(得分:1)
您可以通过利用tools-cli允许您为每个命令行选项指定的:id
,:default
和:assoc-fn
属性来实现此目的。
:id
为“--enable”和“--disable”选项设置相同的ID :default
来指定您希望发生的事情:assoc-fn
指定选项对选项图的影响。您希望每次出现“--disable”时设置的值为false
,并且每次出现true
时都要设置为--enable
。全部放在一起:
(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}