Skip to content

Commit 898c5d2

Browse files
committed
Implement length rule for urls
1 parent bb2af87 commit 898c5d2

7 files changed

+679
-0
lines changed

garde/src/rules/url.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,36 @@ impl<T: Url> Url for Option<T> {
5252
}
5353
}
5454
}
55+
56+
impl super::length::HasSimpleLength for url::Url {
57+
fn length(&self) -> usize {
58+
self.as_str().len()
59+
}
60+
}
61+
62+
impl super::length::HasChars for url::Url {
63+
fn num_chars(&self) -> usize {
64+
self.as_str().chars().count()
65+
}
66+
}
67+
68+
#[cfg(feature = "unicode")]
69+
impl super::length::HasGraphemes for url::Url {
70+
fn num_graphemes(&self) -> usize {
71+
use unicode_segmentation::UnicodeSegmentation;
72+
73+
self.as_str().graphemes(true).count()
74+
}
75+
}
76+
77+
impl super::length::HasBytes for url::Url {
78+
fn num_bytes(&self) -> usize {
79+
self.as_str().len()
80+
}
81+
}
82+
83+
impl super::length::HasUtf16CodeUnits for url::Url {
84+
fn num_code_units(&self) -> usize {
85+
self.as_str().encode_utf16().count()
86+
}
87+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
---
2+
source: garde/tests/./rules/url.rs
3+
expression: snapshot
4+
---
5+
Struct {
6+
field: Url {
7+
scheme: "https",
8+
cannot_be_a_base: false,
9+
username: "",
10+
password: None,
11+
host: Some(
12+
Domain(
13+
"www.youtube.com",
14+
),
15+
),
16+
port: None,
17+
path: "/",
18+
query: None,
19+
fragment: None,
20+
},
21+
v: Struct {
22+
default: Url {
23+
scheme: "https",
24+
cannot_be_a_base: false,
25+
username: "",
26+
password: None,
27+
host: Some(
28+
Domain(
29+
"www.youtube.com",
30+
),
31+
),
32+
port: None,
33+
path: "/",
34+
query: None,
35+
fragment: None,
36+
},
37+
simple: Url {
38+
scheme: "https",
39+
cannot_be_a_base: false,
40+
username: "",
41+
password: None,
42+
host: Some(
43+
Domain(
44+
"www.youtube.com",
45+
),
46+
),
47+
port: None,
48+
path: "/",
49+
query: None,
50+
fragment: None,
51+
},
52+
bytes: Url {
53+
scheme: "https",
54+
cannot_be_a_base: false,
55+
username: "",
56+
password: None,
57+
host: Some(
58+
Domain(
59+
"www.youtube.com",
60+
),
61+
),
62+
port: None,
63+
path: "/",
64+
query: None,
65+
fragment: None,
66+
},
67+
chars: Url {
68+
scheme: "https",
69+
cannot_be_a_base: false,
70+
username: "",
71+
password: None,
72+
host: Some(
73+
Domain(
74+
"www.youtube.com",
75+
),
76+
),
77+
port: None,
78+
path: "/",
79+
query: None,
80+
fragment: None,
81+
},
82+
graphemes: Url {
83+
scheme: "https",
84+
cannot_be_a_base: false,
85+
username: "",
86+
password: None,
87+
host: Some(
88+
Domain(
89+
"www.youtube.com",
90+
),
91+
),
92+
port: None,
93+
path: "/",
94+
query: None,
95+
fragment: None,
96+
},
97+
utf_16_code_units: Url {
98+
scheme: "https",
99+
cannot_be_a_base: false,
100+
username: "",
101+
password: None,
102+
host: Some(
103+
Domain(
104+
"www.youtube.com",
105+
),
106+
),
107+
port: None,
108+
path: "/",
109+
query: None,
110+
fragment: None,
111+
},
112+
},
113+
}
114+
field: length is lower than 30
115+
v.bytes: length is lower than 30
116+
v.chars: length is lower than 30
117+
v.default: length is lower than 30
118+
v.graphemes: length is lower than 30
119+
v.simple: length is lower than 30
120+
v.utf_16_code_units: length is lower than 30
121+
122+
Tuple(
123+
Url {
124+
scheme: "https",
125+
cannot_be_a_base: false,
126+
username: "",
127+
password: None,
128+
host: Some(
129+
Domain(
130+
"www.youtube.com",
131+
),
132+
),
133+
port: None,
134+
path: "/",
135+
query: None,
136+
fragment: None,
137+
},
138+
)
139+
[0]: length is lower than 30
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
source: garde/tests/./rules/url.rs
3+
expression: snapshot
4+
---
5+
Struct {
6+
default: Url {
7+
scheme: "https",
8+
cannot_be_a_base: false,
9+
username: "",
10+
password: None,
11+
host: Some(
12+
Domain(
13+
"www.youtube.com",
14+
),
15+
),
16+
port: None,
17+
path: "/",
18+
query: None,
19+
fragment: None,
20+
},
21+
simple: Url {
22+
scheme: "https",
23+
cannot_be_a_base: false,
24+
username: "",
25+
password: None,
26+
host: Some(
27+
Domain(
28+
"www.youtube.com",
29+
),
30+
),
31+
port: None,
32+
path: "/",
33+
query: None,
34+
fragment: None,
35+
},
36+
bytes: Url {
37+
scheme: "https",
38+
cannot_be_a_base: false,
39+
username: "",
40+
password: None,
41+
host: Some(
42+
Domain(
43+
"www.youtube.com",
44+
),
45+
),
46+
port: None,
47+
path: "/",
48+
query: None,
49+
fragment: None,
50+
},
51+
chars: Url {
52+
scheme: "https",
53+
cannot_be_a_base: false,
54+
username: "",
55+
password: None,
56+
host: Some(
57+
Domain(
58+
"www.youtube.com",
59+
),
60+
),
61+
port: None,
62+
path: "/",
63+
query: None,
64+
fragment: None,
65+
},
66+
graphemes: Url {
67+
scheme: "https",
68+
cannot_be_a_base: false,
69+
username: "",
70+
password: None,
71+
host: Some(
72+
Domain(
73+
"www.youtube.com",
74+
),
75+
),
76+
port: None,
77+
path: "/",
78+
query: None,
79+
fragment: None,
80+
},
81+
utf_16_code_units: Url {
82+
scheme: "https",
83+
cannot_be_a_base: false,
84+
username: "",
85+
password: None,
86+
host: Some(
87+
Domain(
88+
"www.youtube.com",
89+
),
90+
),
91+
port: None,
92+
path: "/",
93+
query: None,
94+
fragment: None,
95+
},
96+
}
97+
bytes: length is lower than 30
98+
chars: length is lower than 30
99+
default: length is lower than 30
100+
graphemes: length is lower than 30
101+
simple: length is lower than 30
102+
utf_16_code_units: length is lower than 30
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
---
2+
source: garde/tests/./rules/url.rs
3+
expression: snapshot
4+
---
5+
Struct {
6+
default: Url {
7+
scheme: "https",
8+
cannot_be_a_base: false,
9+
username: "",
10+
password: None,
11+
host: Some(
12+
Domain(
13+
"www.youtube.com",
14+
),
15+
),
16+
port: None,
17+
path: "/watch",
18+
query: Some(
19+
"v=dQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQ",
20+
),
21+
fragment: None,
22+
},
23+
simple: Url {
24+
scheme: "https",
25+
cannot_be_a_base: false,
26+
username: "",
27+
password: None,
28+
host: Some(
29+
Domain(
30+
"www.youtube.com",
31+
),
32+
),
33+
port: None,
34+
path: "/watch",
35+
query: Some(
36+
"v=dQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQ",
37+
),
38+
fragment: None,
39+
},
40+
bytes: Url {
41+
scheme: "https",
42+
cannot_be_a_base: false,
43+
username: "",
44+
password: None,
45+
host: Some(
46+
Domain(
47+
"www.youtube.com",
48+
),
49+
),
50+
port: None,
51+
path: "/watch",
52+
query: Some(
53+
"v=dQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQ",
54+
),
55+
fragment: None,
56+
},
57+
chars: Url {
58+
scheme: "https",
59+
cannot_be_a_base: false,
60+
username: "",
61+
password: None,
62+
host: Some(
63+
Domain(
64+
"www.youtube.com",
65+
),
66+
),
67+
port: None,
68+
path: "/watch",
69+
query: Some(
70+
"v=dQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQ",
71+
),
72+
fragment: None,
73+
},
74+
graphemes: Url {
75+
scheme: "https",
76+
cannot_be_a_base: false,
77+
username: "",
78+
password: None,
79+
host: Some(
80+
Domain(
81+
"www.youtube.com",
82+
),
83+
),
84+
port: None,
85+
path: "/watch",
86+
query: Some(
87+
"v=dQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQ",
88+
),
89+
fragment: None,
90+
},
91+
utf_16_code_units: Url {
92+
scheme: "https",
93+
cannot_be_a_base: false,
94+
username: "",
95+
password: None,
96+
host: Some(
97+
Domain(
98+
"www.youtube.com",
99+
),
100+
),
101+
port: None,
102+
path: "/watch",
103+
query: Some(
104+
"v=dQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQdQw4w9WgXcQ",
105+
),
106+
fragment: None,
107+
},
108+
}
109+
bytes: length is greater than 100
110+
chars: length is greater than 100
111+
default: length is greater than 100
112+
graphemes: length is greater than 100
113+
simple: length is greater than 100
114+
utf_16_code_units: length is greater than 100

0 commit comments

Comments
 (0)