From 6f3763859303df9fdf92f64f95e505a973f82f55 Mon Sep 17 00:00:00 2001 From: kanarus Date: Sun, 14 Dec 2025 10:13:56 +0900 Subject: [PATCH] chore: add `garde` crate example --- examples/Cargo.toml | 3 +- examples/examples/garde_crate.rs | 35 ++++++++++++ examples/examples/inlined_closure.rs | 16 ++++-- examples/examples/readme.rs | 18 ++++-- examples/examples/validator_crate.rs | 31 +++++++---- examples/examples/various_users.rs | 82 +++++++++++++--------------- 6 files changed, 117 insertions(+), 68 deletions(-) create mode 100644 examples/examples/garde_crate.rs diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 8c5e01b..ebd643f 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -11,4 +11,5 @@ edition = "2024" [dev-dependencies] serdev = { path = "../serdev", features = ["derive"] } serde_json = { version = "1.0" } -validator = { version = "0.20", features = ["derive"] } \ No newline at end of file +validator = { version = "0.20", features = ["derive"] } +garde = { version = "0.22", features = ["derive"] } \ No newline at end of file diff --git a/examples/examples/garde_crate.rs b/examples/examples/garde_crate.rs new file mode 100644 index 0000000..399a508 --- /dev/null +++ b/examples/examples/garde_crate.rs @@ -0,0 +1,35 @@ +use serdev::Deserialize; +use garde::Validate; + +#[derive(Deserialize, Validate, Debug, PartialEq)] +#[serde(validate = "Validate::validate")] +struct User<'a> { + #[garde(ascii, length(min = 3, max = 25))] + username: &'a str, + #[garde(length(min = 15))] + password: &'a str, +} + +fn main() { + let result = serde_json::from_str::( + r#"{ + "username": "test", + "password": "not_a_very_good_paddword" + }"# + ); + assert_eq!( + dbg!(result).unwrap(), + User { + username: "test", + password: "not_a_very_good_paddword", + } + ); + + let result = serde_json::from_str::( + r#"{ + "username": "test", + "password": "short_password" + }"# + ); + assert!(dbg!(result).is_err()); +} diff --git a/examples/examples/inlined_closure.rs b/examples/examples/inlined_closure.rs index f6925d5..cdb1ec6 100644 --- a/examples/examples/inlined_closure.rs +++ b/examples/examples/inlined_closure.rs @@ -1,4 +1,4 @@ -use serdev::{Serialize, Deserialize}; +use serdev::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] #[serde(validate = r#"|p| (p.x * p.y <= 100).then_some(()).ok_or("x * y must not exceed 100")"#)] @@ -8,16 +8,22 @@ struct Point { } fn main() { - let point = serde_json::from_str::(r#" + let point = serde_json::from_str::( + r#" { "x" : 1, "y" : 2 } - "#).unwrap(); + "#, + ) + .unwrap(); // Prints point = Point { x: 1, y: 2 } println!("point = {point:?}"); - let error = serde_json::from_str::(r#" + let error = serde_json::from_str::( + r#" { "x" : 10, "y" : 20 } - "#).unwrap_err(); + "#, + ) + .unwrap_err(); // Prints error = x * y must not exceed 100 println!("error = {error}"); diff --git a/examples/examples/readme.rs b/examples/examples/readme.rs index 9a4d0a2..30fbabe 100644 --- a/examples/examples/readme.rs +++ b/examples/examples/readme.rs @@ -1,4 +1,4 @@ -use serdev::{Serialize, Deserialize}; +use serdev::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] #[serde(validate = "Self::validate")] @@ -10,23 +10,29 @@ struct Point { impl Point { fn validate(&self) -> Result<(), impl std::fmt::Display> { if self.x * self.y > 100 { - return Err("x * y must not exceed 100") + return Err("x * y must not exceed 100"); } Ok(()) } } fn main() { - let point = serde_json::from_str::(r#" + let point = serde_json::from_str::( + r#" { "x" : 1, "y" : 2 } - "#).unwrap(); + "#, + ) + .unwrap(); // Prints point = Point { x: 1, y: 2 } println!("point = {point:?}"); - let error = serde_json::from_str::(r#" + let error = serde_json::from_str::( + r#" { "x" : 10, "y" : 20 } - "#).unwrap_err(); + "#, + ) + .unwrap_err(); // Prints error = x * y must not exceed 100 println!("error = {error}"); diff --git a/examples/examples/validator_crate.rs b/examples/examples/validator_crate.rs index 8670d42..52233b8 100644 --- a/examples/examples/validator_crate.rs +++ b/examples/examples/validator_crate.rs @@ -27,7 +27,8 @@ fn validate_unique_username(username: &str) -> Result<(), ValidationError> { } fn main() { - let signupdata = serde_json::from_str::(r#" + let signupdata = serde_json::from_str::( + r#" { "mail": "serdev@ohkami.rs", "site": "https://ohkami.rs", @@ -35,16 +36,22 @@ fn main() { "age": 20, "height": 0.0 } - "#).unwrap(); - assert_eq!(signupdata, SignupData { - mail: String::from("serdev@ohkami.rs"), - site: String::from("https://ohkami.rs"), - first_name: String::from("serdev"), - age: 20, - height: 0.0 - }); + "#, + ) + .unwrap(); + assert_eq!( + signupdata, + SignupData { + mail: String::from("serdev@ohkami.rs"), + site: String::from("https://ohkami.rs"), + first_name: String::from("serdev"), + age: 20, + height: 0.0 + } + ); - let error = serde_json::from_str::(r#" + let error = serde_json::from_str::( + r#" { "mail": "serdev@ohkami.rs", "site": "https://ohkami.rs", @@ -52,6 +59,8 @@ fn main() { "age": 0, "height": 0.0 } - "#).unwrap_err(); + "#, + ) + .unwrap_err(); println!("error: {error}"); } diff --git a/examples/examples/various_users.rs b/examples/examples/various_users.rs index 8ec3d98..6e10acb 100644 --- a/examples/examples/various_users.rs +++ b/examples/examples/various_users.rs @@ -1,21 +1,21 @@ -use serdev::{Serialize, Deserialize}; +use serdev::{Deserialize, Serialize}; #[derive(Debug, PartialEq, Serialize, Deserialize)] struct User { name: String, - age: usize, + age: usize, } #[derive(Debug, PartialEq, Deserialize)] #[serde(validate = "Self::validate")] struct VUser { name: String, - age: usize, + age: usize, } impl VUser { fn validate(&self) -> Result<(), impl std::fmt::Display> { if self.name.is_empty() { - return Err("`name` must not be empty") + return Err("`name` must not be empty"); } Ok(()) } @@ -25,12 +25,12 @@ impl VUser { #[serde(validate(by = "Self::validate", error = "&'static str"))] struct EUser { name: String, - age: usize, + age: usize, } impl EUser { fn validate(&self) -> Result<(), &'static str> { if self.name.is_empty() { - return Err("`name` must not be empty") + return Err("`name` must not be empty"); } Ok(()) } @@ -38,15 +38,15 @@ impl EUser { #[derive(Debug, PartialEq, Deserialize)] #[serde(validate = "Self::validate")] -struct GUser<'n, Name: From+ToString, Age: From> { - name: Name, - age: Age, - nickname: Option<&'n str> +struct GUser<'n, Name: From + ToString, Age: From> { + name: Name, + age: Age, + nickname: Option<&'n str>, } -impl<'n, Name: From+ToString, Age: From> GUser<'n, Name, Age> { +impl<'n, Name: From + ToString, Age: From> GUser<'n, Name, Age> { fn validate(&self) -> Result<(), impl std::fmt::Display> { if self.name.to_string().is_empty() { - return Err("`name` must not be empty") + return Err("`name` must not be empty"); } Ok(()) } @@ -56,76 +56,68 @@ fn main() { assert_eq!( serde_json::to_string(&User { name: String::from("serdev"), - age: 0 - }).unwrap(), + age: 0 + }) + .unwrap(), r#"{"name":"serdev","age":0}"# ); assert_eq!( - serde_json::from_str::( - r#"{"age":4,"name":"ohkami"}"# - ).unwrap(), + serde_json::from_str::(r#"{"age":4,"name":"ohkami"}"#).unwrap(), User { name: String::from("ohkami"), - age: 4 + age: 4 } ); assert_eq!( - serde_json::from_str::( - r#"{"age":4,"name":"ohkami"}"# - ).unwrap(), + serde_json::from_str::(r#"{"age":4,"name":"ohkami"}"#).unwrap(), VUser { name: String::from("ohkami"), - age: 4 + age: 4 } ); assert_eq!( - serde_json::from_str::( - r#"{"age":4,"name":""}"# - ).unwrap_err().to_string(), + serde_json::from_str::(r#"{"age":4,"name":""}"#) + .unwrap_err() + .to_string(), "`name` must not be empty" ); assert_eq!( - serde_json::from_str::( - r#"{"age":4,"name":"ohkami"}"# - ).unwrap(), + serde_json::from_str::(r#"{"age":4,"name":"ohkami"}"#).unwrap(), EUser { name: String::from("ohkami"), - age: 4 + age: 4 } ); assert_eq!( - serde_json::from_str::( - r#"{"age":4,"name":""}"# - ).unwrap_err().to_string(), + serde_json::from_str::(r#"{"age":4,"name":""}"#) + .unwrap_err() + .to_string(), "`name` must not be empty" ); assert_eq!( - serde_json::from_str::>( - r#"{"age":4,"name":"ohkami"}"# - ).unwrap(), + serde_json::from_str::>(r#"{"age":4,"name":"ohkami"}"#).unwrap(), GUser { - name: String::from("ohkami"), - age: 4, + name: String::from("ohkami"), + age: 4, nickname: None } ); assert_eq!( - serde_json::from_str::>( - r#"{"age":4,"nickname":"wolf","name":"ohkami"}"# - ).unwrap(), + serde_json::from_str::>(r#"{"age":4,"nickname":"wolf","name":"ohkami"}"#) + .unwrap(), GUser { - name: String::from("ohkami"), - age: 4, + name: String::from("ohkami"), + age: 4, nickname: Some("wolf") } ); assert_eq!( - serde_json::from_str::>( - r#"{"age":4,"nickname":"wolf","name":""}"# - ).unwrap_err().to_string(), + serde_json::from_str::>(r#"{"age":4,"nickname":"wolf","name":""}"#) + .unwrap_err() + .to_string(), "`name` must not be empty" ); }