(nsspecs(:require[clojure.spec.alpha:ass]))(s/def::user-iduuid?)(s/def::email(s/andstring?#(re-matches#"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"%)))(s/def::username(s/andstring?#(re-matches#"^[a-zA-Z0-9_-]{3,20}$"%)))(s/def::password(s/andstring?#(>=(count%)8)))(s/def::age(s/int-in13130))(s/def::roles#{:admin:user:moderator})(s/def::user(s/keys:req-un[::user-id::email::username::password::age]:opt-un[::roles]))(s/fdefcreate-user:args(s/cat:user-data::user):ret(s/or:success::user:failure::error-response))(s/def::error-response(s/keys:req-un[::error::message]))(s/def::errorkeyword?)(s/def::messagestring?)(defnvalidate-email[email](s/valid?::emailemail))(defnvalidate-username[username](s/valid?::usernameusername))(defnvalidate-password[password](s/valid?::passwordpassword))(defnvalidate-age[age](s/valid?::ageage))(defnvalidate-user[user](s/valid?::useruser))(defsample-user{:user-id(random-uuid):email"user@example.com":username"john_doe123":password"secure_password123":age25:roles#{:user}})(definvalid-user{:user-id(random-uuid):email"invalid-email":username"j";; too short:password"123";; too short:age10});; too young(defnvalidate-and-explain[specdata](if(s/valid?specdata)(println"Valid:"data)(do(println"Invalid:"data)(println"Explanation:")(s/explainspecdata))))(comment(defnrun-examples[](println"\n=== Email Validation ===")(println"Valid email:"(validate-email"user@example.com"))(println"Invalid email:"(validate-email"invalid-email"))(println"\n=== Username Validation ===")(println"Valid username:"(validate-username"john_doe123"))(println"Invalid username:"(validate-username"a"));; too short(println"\n=== Password Validation ===")(println"Valid password:"(validate-password"secure_password123"))(println"Invalid password:"(validate-password"123"));; too short(println"\n=== Age Validation ===")(println"Valid age:"(validate-age25))(println"Invalid age:"(validate-age10));; too young(println"\n=== Complete User Validation ===")(println"Valid User:")(validate-and-explain::usersample-user)(println"\nInvalid User:")(validate-and-explain::userinvalid-user))(run-examples))