(defn make-map [args cmdspec]
(let [{spec true [rest-sym] false} (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}]))
defaults (into {} (for [[_ {:keys [default sym]}] key-data
:when default]
[sym default]))]
(loop [[argkey & [argval :as r]] args
cmdmap (assoc defaults :cmdspec cmdspec rest-str [])]
(if argkey
(let [[_ & [keybase]] (re-find #"^--?(.*)" argkey)]
(cond
(= 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 (next r) (assoc cmdmap (:sym found)
(if (or (nil? r) (= \- (ffirst r)))
(:default found)
(first r)))))
(throw (Exception. (str "Unknown option " argkey))))))
cmdmap))))
Used in 0 other vars
Comments top
No comments for make-map. Log in to add a comment.