Skip to content

Instantly share code, notes, and snippets.

@swannodette
Forked from nijikokun/example-user.js
Created May 4, 2012 11:39
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save swannodette/2594296 to your computer and use it in GitHub Desktop.
Save swannodette/2594296 to your computer and use it in GitHub Desktop.
Beautiful Validation... Why have I never thought of this before?!

At a certain point you just want pattern matching.

(defn validates-credentials [username password]
(let [uc (count username)
pc (count password)]
(match [username uc password pc]
[(:or nil "") _ _ _] {:error "No username given" :field "name"}
[_ _ (:or nil "") _] {:error "No password given" :field "pass"}
[_ (_ :guard #(< % 3)) _ _] {:error "Username less than 3 characters" :field "pass"}
[_ _ _ (_ :guard #(< % 4))] {:error "Password less than 4 characters" :field "pass"}
[#"^([a-z0-9-_]+)$" _ _ _] {:error "Username contains invalid characters" :field "name"}
:else true)))
var user = {
validateCredentials: function (username, password) {
return (
(!(username += '') || username === '') ? { error: "No Username Given.", field: 'name' }
: (!(username += '') || password === '') ? { error: "No Password Given.", field: 'pass' }
: (username.length < 3) ? { error: "Username is less than 3 Characters.", field: 'name' }
: (password.length < 4) ? { error: "Password is less than 4 Characters.", field: 'pass' }
: (!/^([a-z0-9-_]+)$/i.test(username)) ? { error: "Username contains invalid characters.", field: 'name' }
: false
);
}
};
var results = user.validateCredentials('Nijikokun','somepassword');
console.log(results);
@swannodette
Copy link
Author

I don't see how verifying a password requires another another pattern. You test the password, and it's either equal to the thing you want to verify or not.

At some point you just want composable rules - core.logic.

@apg
Copy link

apg commented May 5, 2012

Sure, but now you have error handling outside of the match statement, and you've added an if statement, etc. Validation is tricky. Pattern matching doesn't make it any less so.

@swannodette
Copy link
Author

Don't disagree. But for simple cases like this pattern matching is fine. For something more sophisticated ... yes, you need something more sophisticated :)

@nijikokun
Copy link

this is pretty gouda :3

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