Skip to content

Commit 8734172

Browse files
authored
chore: add garde crate example (#39)
1 parent 0a3e40f commit 8734172

6 files changed

Lines changed: 117 additions & 68 deletions

File tree

examples/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ edition = "2024"
1111
[dev-dependencies]
1212
serdev = { path = "../serdev", features = ["derive"] }
1313
serde_json = { version = "1.0" }
14-
validator = { version = "0.20", features = ["derive"] }
14+
validator = { version = "0.20", features = ["derive"] }
15+
garde = { version = "0.22", features = ["derive"] }

examples/examples/garde_crate.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use serdev::Deserialize;
2+
use garde::Validate;
3+
4+
#[derive(Deserialize, Validate, Debug, PartialEq)]
5+
#[serde(validate = "Validate::validate")]
6+
struct User<'a> {
7+
#[garde(ascii, length(min = 3, max = 25))]
8+
username: &'a str,
9+
#[garde(length(min = 15))]
10+
password: &'a str,
11+
}
12+
13+
fn main() {
14+
let result = serde_json::from_str::<User>(
15+
r#"{
16+
"username": "test",
17+
"password": "not_a_very_good_paddword"
18+
}"#
19+
);
20+
assert_eq!(
21+
dbg!(result).unwrap(),
22+
User {
23+
username: "test",
24+
password: "not_a_very_good_paddword",
25+
}
26+
);
27+
28+
let result = serde_json::from_str::<User>(
29+
r#"{
30+
"username": "test",
31+
"password": "short_password"
32+
}"#
33+
);
34+
assert!(dbg!(result).is_err());
35+
}

examples/examples/inlined_closure.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use serdev::{Serialize, Deserialize};
1+
use serdev::{Deserialize, Serialize};
22

33
#[derive(Serialize, Deserialize, Debug)]
44
#[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 {
88
}
99

1010
fn main() {
11-
let point = serde_json::from_str::<Point>(r#"
11+
let point = serde_json::from_str::<Point>(
12+
r#"
1213
{ "x" : 1, "y" : 2 }
13-
"#).unwrap();
14+
"#,
15+
)
16+
.unwrap();
1417

1518
// Prints point = Point { x: 1, y: 2 }
1619
println!("point = {point:?}");
1720

18-
let error = serde_json::from_str::<Point>(r#"
21+
let error = serde_json::from_str::<Point>(
22+
r#"
1923
{ "x" : 10, "y" : 20 }
20-
"#).unwrap_err();
24+
"#,
25+
)
26+
.unwrap_err();
2127

2228
// Prints error = x * y must not exceed 100
2329
println!("error = {error}");

examples/examples/readme.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use serdev::{Serialize, Deserialize};
1+
use serdev::{Deserialize, Serialize};
22

33
#[derive(Serialize, Deserialize, Debug)]
44
#[serde(validate = "Self::validate")]
@@ -10,23 +10,29 @@ struct Point {
1010
impl Point {
1111
fn validate(&self) -> Result<(), impl std::fmt::Display> {
1212
if self.x * self.y > 100 {
13-
return Err("x * y must not exceed 100")
13+
return Err("x * y must not exceed 100");
1414
}
1515
Ok(())
1616
}
1717
}
1818

1919
fn main() {
20-
let point = serde_json::from_str::<Point>(r#"
20+
let point = serde_json::from_str::<Point>(
21+
r#"
2122
{ "x" : 1, "y" : 2 }
22-
"#).unwrap();
23+
"#,
24+
)
25+
.unwrap();
2326

2427
// Prints point = Point { x: 1, y: 2 }
2528
println!("point = {point:?}");
2629

27-
let error = serde_json::from_str::<Point>(r#"
30+
let error = serde_json::from_str::<Point>(
31+
r#"
2832
{ "x" : 10, "y" : 20 }
29-
"#).unwrap_err();
33+
"#,
34+
)
35+
.unwrap_err();
3036

3137
// Prints error = x * y must not exceed 100
3238
println!("error = {error}");

examples/examples/validator_crate.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,40 @@ fn validate_unique_username(username: &str) -> Result<(), ValidationError> {
2727
}
2828

2929
fn main() {
30-
let signupdata = serde_json::from_str::<SignupData>(r#"
30+
let signupdata = serde_json::from_str::<SignupData>(
31+
r#"
3132
{
3233
"mail": "serdev@ohkami.rs",
3334
"site": "https://ohkami.rs",
3435
"firstName": "serdev",
3536
"age": 20,
3637
"height": 0.0
3738
}
38-
"#).unwrap();
39-
assert_eq!(signupdata, SignupData {
40-
mail: String::from("serdev@ohkami.rs"),
41-
site: String::from("https://ohkami.rs"),
42-
first_name: String::from("serdev"),
43-
age: 20,
44-
height: 0.0
45-
});
39+
"#,
40+
)
41+
.unwrap();
42+
assert_eq!(
43+
signupdata,
44+
SignupData {
45+
mail: String::from("serdev@ohkami.rs"),
46+
site: String::from("https://ohkami.rs"),
47+
first_name: String::from("serdev"),
48+
age: 20,
49+
height: 0.0
50+
}
51+
);
4652

47-
let error = serde_json::from_str::<SignupData>(r#"
53+
let error = serde_json::from_str::<SignupData>(
54+
r#"
4855
{
4956
"mail": "serdev@ohkami.rs",
5057
"site": "https://ohkami.rs",
5158
"firstName": "serdev",
5259
"age": 0,
5360
"height": 0.0
5461
}
55-
"#).unwrap_err();
62+
"#,
63+
)
64+
.unwrap_err();
5665
println!("error: {error}");
5766
}

examples/examples/various_users.rs

Lines changed: 37 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
use serdev::{Serialize, Deserialize};
1+
use serdev::{Deserialize, Serialize};
22

33
#[derive(Debug, PartialEq, Serialize, Deserialize)]
44
struct User {
55
name: String,
6-
age: usize,
6+
age: usize,
77
}
88

99
#[derive(Debug, PartialEq, Deserialize)]
1010
#[serde(validate = "Self::validate")]
1111
struct VUser {
1212
name: String,
13-
age: usize,
13+
age: usize,
1414
}
1515
impl VUser {
1616
fn validate(&self) -> Result<(), impl std::fmt::Display> {
1717
if self.name.is_empty() {
18-
return Err("`name` must not be empty")
18+
return Err("`name` must not be empty");
1919
}
2020
Ok(())
2121
}
@@ -25,28 +25,28 @@ impl VUser {
2525
#[serde(validate(by = "Self::validate", error = "&'static str"))]
2626
struct EUser {
2727
name: String,
28-
age: usize,
28+
age: usize,
2929
}
3030
impl EUser {
3131
fn validate(&self) -> Result<(), &'static str> {
3232
if self.name.is_empty() {
33-
return Err("`name` must not be empty")
33+
return Err("`name` must not be empty");
3434
}
3535
Ok(())
3636
}
3737
}
3838

3939
#[derive(Debug, PartialEq, Deserialize)]
4040
#[serde(validate = "Self::validate")]
41-
struct GUser<'n, Name: From<String>+ToString, Age: From<u8>> {
42-
name: Name,
43-
age: Age,
44-
nickname: Option<&'n str>
41+
struct GUser<'n, Name: From<String> + ToString, Age: From<u8>> {
42+
name: Name,
43+
age: Age,
44+
nickname: Option<&'n str>,
4545
}
46-
impl<'n, Name: From<String>+ToString, Age: From<u8>> GUser<'n, Name, Age> {
46+
impl<'n, Name: From<String> + ToString, Age: From<u8>> GUser<'n, Name, Age> {
4747
fn validate(&self) -> Result<(), impl std::fmt::Display> {
4848
if self.name.to_string().is_empty() {
49-
return Err("`name` must not be empty")
49+
return Err("`name` must not be empty");
5050
}
5151
Ok(())
5252
}
@@ -56,76 +56,68 @@ fn main() {
5656
assert_eq!(
5757
serde_json::to_string(&User {
5858
name: String::from("serdev"),
59-
age: 0
60-
}).unwrap(),
59+
age: 0
60+
})
61+
.unwrap(),
6162
r#"{"name":"serdev","age":0}"#
6263
);
6364
assert_eq!(
64-
serde_json::from_str::<User>(
65-
r#"{"age":4,"name":"ohkami"}"#
66-
).unwrap(),
65+
serde_json::from_str::<User>(r#"{"age":4,"name":"ohkami"}"#).unwrap(),
6766
User {
6867
name: String::from("ohkami"),
69-
age: 4
68+
age: 4
7069
}
7170
);
7271

7372
assert_eq!(
74-
serde_json::from_str::<VUser>(
75-
r#"{"age":4,"name":"ohkami"}"#
76-
).unwrap(),
73+
serde_json::from_str::<VUser>(r#"{"age":4,"name":"ohkami"}"#).unwrap(),
7774
VUser {
7875
name: String::from("ohkami"),
79-
age: 4
76+
age: 4
8077
}
8178
);
8279
assert_eq!(
83-
serde_json::from_str::<VUser>(
84-
r#"{"age":4,"name":""}"#
85-
).unwrap_err().to_string(),
80+
serde_json::from_str::<VUser>(r#"{"age":4,"name":""}"#)
81+
.unwrap_err()
82+
.to_string(),
8683
"`name` must not be empty"
8784
);
8885

8986
assert_eq!(
90-
serde_json::from_str::<EUser>(
91-
r#"{"age":4,"name":"ohkami"}"#
92-
).unwrap(),
87+
serde_json::from_str::<EUser>(r#"{"age":4,"name":"ohkami"}"#).unwrap(),
9388
EUser {
9489
name: String::from("ohkami"),
95-
age: 4
90+
age: 4
9691
}
9792
);
9893
assert_eq!(
99-
serde_json::from_str::<EUser>(
100-
r#"{"age":4,"name":""}"#
101-
).unwrap_err().to_string(),
94+
serde_json::from_str::<EUser>(r#"{"age":4,"name":""}"#)
95+
.unwrap_err()
96+
.to_string(),
10297
"`name` must not be empty"
10398
);
10499

105100
assert_eq!(
106-
serde_json::from_str::<GUser<String, u8>>(
107-
r#"{"age":4,"name":"ohkami"}"#
108-
).unwrap(),
101+
serde_json::from_str::<GUser<String, u8>>(r#"{"age":4,"name":"ohkami"}"#).unwrap(),
109102
GUser {
110-
name: String::from("ohkami"),
111-
age: 4,
103+
name: String::from("ohkami"),
104+
age: 4,
112105
nickname: None
113106
}
114107
);
115108
assert_eq!(
116-
serde_json::from_str::<GUser<String, u8>>(
117-
r#"{"age":4,"nickname":"wolf","name":"ohkami"}"#
118-
).unwrap(),
109+
serde_json::from_str::<GUser<String, u8>>(r#"{"age":4,"nickname":"wolf","name":"ohkami"}"#)
110+
.unwrap(),
119111
GUser {
120-
name: String::from("ohkami"),
121-
age: 4,
112+
name: String::from("ohkami"),
113+
age: 4,
122114
nickname: Some("wolf")
123115
}
124116
);
125117
assert_eq!(
126-
serde_json::from_str::<GUser<String, u8>>(
127-
r#"{"age":4,"nickname":"wolf","name":""}"#
128-
).unwrap_err().to_string(),
118+
serde_json::from_str::<GUser<String, u8>>(r#"{"age":4,"nickname":"wolf","name":""}"#)
119+
.unwrap_err()
120+
.to_string(),
129121
"`name` must not be empty"
130122
);
131123
}

0 commit comments

Comments
 (0)