Skip to content

Instantly share code, notes, and snippets.

@Kaali
Created July 21, 2010 06:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kaali/484140 to your computer and use it in GitHub Desktop.
Save Kaali/484140 to your computer and use it in GitHub Desktop.
(defn validator [param forms]
(remove nil?
(map (fn [[f s]] (when-not (f param) s)) forms)))
(defn- validator-wrapper [forms]
`(fn [param#] (validator param# ~forms)))
(defn form* [forms]
(apply merge
(map (fn [[k v]] {k (validator-wrapper v)}) (apply array-map forms))))
(defmacro defform
"Define a web form for validation"
[name & forms]
(let [validators (form* forms)]
`(defn ~name [params#]
(apply merge
(map (fn [[k# v#]] {k# ((k# ~validators) v#)}) params#)))))
(defn required [param] (not (nil? param)))
(defn minimum-length [minlen]
(fn [param] (>= (count param) minlen)))
(defform test-form
:login [[required "Login is required"]]
:password [[required "Password is required"]
[(minimum-length 5) "Password should be longer than 5 chars"]])
@Kaali
Copy link
Author

Kaali commented Jul 21, 2010

The newest version works, the problem was with the scope of Fns. I guess.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment