aboutsummaryrefslogtreecommitdiff
path: root/src/clojure
diff options
context:
space:
mode:
authorChouser <chouser@n01se.net>2009-02-01 17:42:53 +0000
committerChouser <chouser@n01se.net>2009-02-01 17:42:53 +0000
commit74403acd6116d2048a3c2e78c9f9e51ef5229389 (patch)
tree14175ef6806193bb2c4da7223c7e3eaa30dc945d /src/clojure
parent1c9a8c6ab84098107b89562f1100c41490f37692 (diff)
command-line: simplified the cmdspec parsing code a bit.
Diffstat (limited to 'src/clojure')
-rw-r--r--src/clojure/contrib/command_line.clj45
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)))))