diff options
author | Chouser <chouser@n01se.net> | 2009-02-01 17:42:53 +0000 |
---|---|---|
committer | Chouser <chouser@n01se.net> | 2009-02-01 17:42:53 +0000 |
commit | 74403acd6116d2048a3c2e78c9f9e51ef5229389 (patch) | |
tree | 14175ef6806193bb2c4da7223c7e3eaa30dc945d /src/clojure | |
parent | 1c9a8c6ab84098107b89562f1100c41490f37692 (diff) |
command-line: simplified the cmdspec parsing code a bit.
Diffstat (limited to 'src/clojure')
-rw-r--r-- | src/clojure/contrib/command_line.clj | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/src/clojure/contrib/command_line.clj b/src/clojure/contrib/command_line.clj index ed5ae387..54a8deee 100644 --- a/src/clojure/contrib/command_line.clj +++ b/src/clojure/contrib/command_line.clj @@ -13,33 +13,28 @@ (:use (clojure.contrib [str-utils :only (str-join)]))) (defn make-map [args cmdspec] - (let [{specs true [rest-name] false} (su/group-by vector? cmdspec) - names (assoc (into {} (for [spec specs] - (let [[syms [desc default]] - (split-with symbol? spec)] - [(set (map str syms)) - {:sym (first syms) :default default}]))) - #{"help?" "h?"} {:sym 'help? :default false}) - allnames - (reduce clojure.set/union (keys names)) - get-found (fn [keybase] (some #(and ((key %) keybase) (val %)) names))] + (let [{spec true [rest-sym] false} (su/group-by vector? cmdspec) + rest-str (str rest-sym) + key-data (into {} (for [[syms [_ default]] (map #(split-with symbol? %) + (conj spec '[help? h?])) + sym syms] + [(re-find #"^.*[^?]" (str sym)) + {:sym (str (first syms)) :default default}]))] (loop [[argkey & [argval :as r]] (if (seq args) args ["--help"]) - cmdmap {:cmdspec cmdspec rest-name []}] + cmdmap {:cmdspec cmdspec rest-str []}] (if argkey (let [[_ & [keybase]] (re-find #"^--?(.*)" argkey)] (cond - (= keybase nil) (recur r (update-in cmdmap [rest-name] conj argkey)) - (= keybase "") (update-in cmdmap [rest-name] #(apply conj % r)) - (allnames keybase) - (let [found (get-found keybase)] - (recur (rest r) (assoc cmdmap (:sym found) - (if (or (nil? r) (= \- (ffirst r))) - (:default found) - (first r))))) - (allnames (str keybase "?")) - (let [found (get-found (str keybase "?"))] - (recur r (assoc cmdmap (:sym found) true))) - :else (throw (Exception. (str "Unknown option " argkey))))) + (= keybase nil) (recur r (update-in cmdmap [rest-str] conj argkey)) + (= keybase "") (update-in cmdmap [rest-str] #(apply conj % r)) + :else (if-let [found (key-data keybase)] + (if (= \? (last (:sym found))) + (recur r (assoc cmdmap (:sym found) true)) + (recur (rest r) (assoc cmdmap (:sym found) + (if (or (nil? r) (= \- (ffirst r))) + (:default found) + (first r))))) + (throw (Exception. (str "Unknown option " argkey)))))) cmdmap)))) (defn- align @@ -94,8 +89,8 @@ (if (vector? spec) (first spec) spec)))] - `(let [{:syms ~locals :as cmdmap#} (make-map ~args '~cmdspec)] - (if (cmdmap# '~'help?) + `(let [{:strs ~locals :as cmdmap#} (make-map ~args '~cmdspec)] + (if (cmdmap# "help?") (print-help ~desc cmdmap#) (do ~@body))))) |