clojure core.tools.cli:如何覆盖布尔选项?

时间:2017-06-21 03:55:53

标签: clojure command-line-interface

我想要一个带有如下参数的命令:

--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。

1 个答案:

答案 0 :(得分:1)

您可以通过利用tools-cli允许您为每个命令行选项指定的:id:default:assoc-fn属性来实现此目的。

  • 使用:id为“--enable”和“--disable”选项设置相同的ID
  • 如果既未指定“--enable”或“--disable”,请在其中一个选项中使用: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}