Vous pouvez y parvenir en profitant des propriétés :id
, :default
et :assoc-fn
que les outils-cli vous permet de spécifier pour chaque option de ligne de commande.
- Utilisez
:id
pour définir le même identifiant pour les options « --enable » et « --disable »
- Utilisation
:default
sur l'une des options pour spécifier ce que vous voulez arriver si aucun « --enable » ou "--disable" est spécifié
- Utilisez
:assoc-fn
pour spécifier l'effet de l'option sur la mappe des options. Vous voulez que la valeur soit false
à chaque fois que "--disable" apparaît et à true
chaque fois que --enable
apparaît.
Mettre le tout ensemble:
(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))
Test au 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}
En utilisant la même ID renvoie une erreur, non? Je pensais que les ID devaient être uniques par argument. – djhaskin987
Ce n'est pas le cas. Le code que j'ai inclus fonctionne. Consultez également [docstring for parse-opts] (https://github.com/clojure/tools.cli/blob/master/src/main/clojure/clojure/tools/cli.clj#L498). Il dit spécifiquement que plusieurs entrées d'options peuvent partager le même ': id' – ez121sl