2017-06-21 4 views
0

Je veux une commande qui prend des arguments qui se présentent comme suit:clojure core.tools.cli: Comment remplacer l'option booléenne?

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

Dans la :options clé retournée par clojure.tools.cli/parse-opts, je veux avoir l'option :boolean-flag définie sur true si l'option --enable-boolean-flag est venu dernière sur la ligne de commande et false si --disable-boolean-flag est arrivé en dernier sur la ligne de commande, si cela a du sens.

Des idées?

EDIT: J'utilise 0.3.6 de la bibliothèque core.tools.cli.

Répondre

1

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} 
+0

En utilisant la même ID renvoie une erreur, non? Je pensais que les ID devaient être uniques par argument. – djhaskin987

+0

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