2017-12-26 7 views
2

Ich bin ein Clojure Neuling.Wie akzeptiert man zusätzliche Argumente für eine Option in tools.cli?

Ich brauche mehrere Argumente für die Option -a meiner cli app, wie:

java -jar app.jar -a 12 abc xyz 

erste ist eine Zahl, und die beiden anderen haben Strings sein.

Mein Code ist:

["-a" "--add LINE TYPE ENTRY" "Add entry to specified line number of the menu" 
:parse-fn #(split % #" ") 
:validate [#(number? (Integer/parseInt (first %))) "ERROR: Invalid position"] 

Aber ich beobachtete die %-:parse-fn Funktion übergeben nur das erste Argument enthält ein Vektor zu sein, dh [12]

die anderen Argumente als Wert aufgeführt sind Schlüssel :arguments der von parse-opts

zurück Karte Nun
(1) gibt es eine Möglichkeit zu val idiate diese unverarbeiteten Argumente?
(2) Wie werde ich diese Argumente abrufen und verwenden?

+1

Ich habe dies nicht getan gesehen. Du könntest den Weg der Weitergabe in einem Argument gehen (zB 'java ... -a" 12 abc xyz "' (vielleicht sogar ein besseres Trennzeichen als '' like zB '' '' '' '' ')) - oder Übergeben Sie das mit drei Argumenten (zB '- [lte]') - oder benutzen Sie tools.cli überhaupt nicht, wählen Sie das erste Argument als "Befehl" aus erlaubten aus und wenden Sie den Rest der Argumente darauf an. Aus einer einfachen Benutzerperspektive finde ich das sogar merkwürdig. Es kommt mir kein Unix-CLI in den Sinn, das mehrere Argumente für eine Ein-Buchstaben-Option hat. – cfrick

Antwort

1

Ich denke, Sie können nicht getrennt weiße Werte für eine Option auf einmal analysieren. Normalerweise würden Sie es so tun: -a opt1 -a opt2 -a opt3, aber da Sie einen anderen Typ für opt1 haben, wird dies nicht funktionieren.

Wie wäre es, sie durch Komma zu trennen?

(require '[clojure.tools.cli :refer [parse-opts]]) 

(def cli-opts 
    [["-a" "--add LINE TYPE ENTRY" "Add entry to specified line number of the menu" 
    :parse-fn (fn [a-args] 
       (-> a-args 
        (str/split #",") 
        (update 0 #(Integer/parseInt %)))) 
    :validate [(fn [[num s1 s2]] 
       (and (number? num) 
         (string? s1) 
         (string? s2)))]]]) 

(parse-opts ["-a" "12,abc,xyz"] cli-opts) 

;;=> {:options {:add [12 "abc" "xyz"]}, :arguments [], :summary " -a, --add LINE TYPE ENTRY Add entry to specified line number of the menu", :errors nil} 

wäre eine weitere Option für a zwei oder drei verschiedene Möglichkeiten vorstellen: --line, --type und --entry.

+0

Nun, eine einzelne Zeichenfolge mit Komma-Trennzeichen scheint eine gute Wahl zu sein ... es wird sowieso nicht mit Namen und Zahlen interferieren. Danke, ich werde es versuchen. – Raj

Verwandte Themen