11use crate :: { ffi, ParseUrlError } ;
22
3+ #[ derive( Hash ) ]
34pub struct UrlSearchParams ( * mut ffi:: ada_url_search_params ) ;
45
56impl Drop for UrlSearchParams {
@@ -14,7 +15,7 @@ impl UrlSearchParams {
1415 /// ```
1516 /// use ada_url::UrlSearchParams;
1617 /// let params = UrlSearchParams::parse("a=1&b=2")
17- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
18+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
1819 /// assert_eq!(params.get("a"), Some("1"));
1920 /// assert_eq!(params.get("b"), Some("2"));
2021 /// ```
@@ -27,13 +28,15 @@ impl UrlSearchParams {
2728 } ) )
2829 }
2930
30- /// Returns the size of the UrlSearchParams struct .
31+ /// Returns the unique keys in a UrlSearchParams .
3132 ///
3233 /// ```
3334 /// use ada_url::UrlSearchParams;
3435 /// let params = UrlSearchParams::parse("a=1&b=2")
35- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
36+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
3637 /// assert_eq!(params.len(), 2);
38+ /// let keys = params.keys().into_iter();
39+ /// assert_eq!(keys.count(), params.len());
3740 /// ```
3841 pub fn len ( & self ) -> usize {
3942 unsafe { ffi:: ada_search_params_size ( self . 0 ) }
@@ -68,7 +71,7 @@ impl UrlSearchParams {
6871 /// ```
6972 /// use ada_url::UrlSearchParams;
7073 /// let mut params = UrlSearchParams::parse("a=1&b=2")
71- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
74+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
7275 /// params.set("a", "3");
7376 /// assert_eq!(params.get("a"), Some("3"));
7477 /// ```
@@ -84,30 +87,37 @@ impl UrlSearchParams {
8487 }
8588 }
8689
87- /// Removes a key/value from the UrlSearchParams struct.
88- /// Depending on the value parameter, it will either remove
89- /// the key/value pair or just the key.
90+ /// Removes a key from the UrlSearchParams struct.
9091 ///
9192 /// ```
9293 /// use ada_url::UrlSearchParams;
9394 /// let mut params = UrlSearchParams::parse("a=1&b=2")
94- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
95- /// params.remove ("a", Some("1") );
95+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
96+ /// params.remove_key ("a");
9697 /// assert_eq!(params.get("a"), None);
9798 /// ```
98- pub fn remove ( & mut self , key : & str , value : Option < & str > ) {
99- if let Some ( value) = value {
100- unsafe {
101- ffi:: ada_search_params_remove_value (
102- self . 0 ,
103- key. as_ptr ( ) . cast ( ) ,
104- key. len ( ) ,
105- value. as_ptr ( ) . cast ( ) ,
106- value. len ( ) ,
107- )
108- }
109- } else {
110- unsafe { ffi:: ada_search_params_remove ( self . 0 , key. as_ptr ( ) . cast ( ) , key. len ( ) ) }
99+ pub fn remove_key ( & mut self , key : & str ) {
100+ unsafe { ffi:: ada_search_params_remove ( self . 0 , key. as_ptr ( ) . cast ( ) , key. len ( ) ) }
101+ }
102+
103+ /// Removes a key with a value from the UrlSearchParams struct.
104+ ///
105+ /// ```
106+ /// use ada_url::UrlSearchParams;
107+ /// let mut params = UrlSearchParams::parse("a=1&b=2")
108+ /// .expect("String should have been able to be parsed into an UrlSearchParams.");
109+ /// params.remove("a", "1");
110+ /// assert_eq!(params.get("a"), None);
111+ /// ```
112+ pub fn remove ( & mut self , key : & str , value : & str ) {
113+ unsafe {
114+ ffi:: ada_search_params_remove_value (
115+ self . 0 ,
116+ key. as_ptr ( ) . cast ( ) ,
117+ key. len ( ) ,
118+ value. as_ptr ( ) . cast ( ) ,
119+ value. len ( ) ,
120+ )
111121 }
112122 }
113123
@@ -116,22 +126,30 @@ impl UrlSearchParams {
116126 /// ```
117127 /// use ada_url::UrlSearchParams;
118128 /// let params = UrlSearchParams::parse("a=1&b=2")
119- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
120- /// assert_eq!(params.contains ("a", None ), true);
129+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
130+ /// assert_eq!(params.contains_key ("a"), true);
121131 /// ```
122- pub fn contains ( & self , key : & str , value : Option < & str > ) -> bool {
123- if let Some ( value) = value {
124- unsafe {
125- ffi:: ada_search_params_has_value (
126- self . 0 ,
127- key. as_ptr ( ) . cast ( ) ,
128- key. len ( ) ,
129- value. as_ptr ( ) . cast ( ) ,
130- value. len ( ) ,
131- )
132- }
133- } else {
134- unsafe { ffi:: ada_search_params_has ( self . 0 , key. as_ptr ( ) . cast ( ) , key. len ( ) ) }
132+ pub fn contains_key ( & self , key : & str ) -> bool {
133+ unsafe { ffi:: ada_search_params_has ( self . 0 , key. as_ptr ( ) . cast ( ) , key. len ( ) ) }
134+ }
135+
136+ /// Returns whether the [`UrlSearchParams`] contains the `key` with the `value`.
137+ ///
138+ /// ```
139+ /// use ada_url::UrlSearchParams;
140+ /// let params = UrlSearchParams::parse("a=1&b=2")
141+ /// .expect("String should have been able to be parsed into an UrlSearchParams.");
142+ /// assert_eq!(params.contains("a", "1"), true);
143+ /// ```
144+ pub fn contains ( & self , key : & str , value : & str ) -> bool {
145+ unsafe {
146+ ffi:: ada_search_params_has_value (
147+ self . 0 ,
148+ key. as_ptr ( ) . cast ( ) ,
149+ key. len ( ) ,
150+ value. as_ptr ( ) . cast ( ) ,
151+ value. len ( ) ,
152+ )
135153 }
136154 }
137155
@@ -140,7 +158,7 @@ impl UrlSearchParams {
140158 /// ```
141159 /// use ada_url::UrlSearchParams;
142160 /// let params = UrlSearchParams::parse("a=1&b=2")
143- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
161+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
144162 /// assert_eq!(params.get("a"), Some("1"));
145163 /// assert_eq!(params.get("c"), None);
146164 /// ```
@@ -160,7 +178,7 @@ impl UrlSearchParams {
160178 /// ```
161179 /// use ada_url::UrlSearchParams;
162180 /// let params = UrlSearchParams::parse("a=1&a=2")
163- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
181+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
164182 /// let pairs = params.get_all("a");
165183 /// assert_eq!(pairs.len(), 2);
166184 /// ```
@@ -177,20 +195,20 @@ impl UrlSearchParams {
177195 /// ```
178196 /// use ada_url::UrlSearchParams;
179197 /// let params = UrlSearchParams::parse("a=1")
180- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
198+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
181199 /// let mut keys = params.keys();
182200 /// assert!(keys.next().is_some());
183201 pub fn keys ( & self ) -> UrlSearchParamsKeyIterator {
184202 let iterator = unsafe { ffi:: ada_search_params_get_keys ( self . 0 ) } ;
185203 UrlSearchParamsKeyIterator :: new ( iterator)
186204 }
187205
188- /// Returns all keys as an iterator
206+ /// Returns all values as an iterator
189207 ///
190208 /// ```
191209 /// use ada_url::UrlSearchParams;
192210 /// let params = UrlSearchParams::parse("a=1")
193- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
211+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
194212 /// let mut values = params.values();
195213 /// assert!(values.next().is_some());
196214 pub fn values ( & self ) -> UrlSearchParamsValueIterator {
@@ -203,7 +221,7 @@ impl UrlSearchParams {
203221 /// ```
204222 /// use ada_url::UrlSearchParams;
205223 /// let params = UrlSearchParams::parse("a=1")
206- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
224+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
207225 /// let mut entries = params.entries();
208226 /// assert_eq!(entries.next(), Some(("a", "1")));
209227 /// ```
@@ -213,12 +231,6 @@ impl UrlSearchParams {
213231 }
214232}
215233
216- impl core:: hash:: Hash for UrlSearchParams {
217- fn hash < H : core:: hash:: Hasher > ( & self , state : & mut H ) {
218- self . 0 . hash ( state) ;
219- }
220- }
221-
222234#[ cfg( feature = "std" ) ]
223235impl core:: str:: FromStr for UrlSearchParams {
224236 type Err = ParseUrlError < Box < str > > ;
@@ -235,7 +247,7 @@ impl core::str::FromStr for UrlSearchParams {
235247/// ```
236248/// use ada_url::UrlSearchParams;
237249/// let params = UrlSearchParams::parse("a=1&b=2")
238- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
250+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
239251/// assert_eq!(params.to_string(), "a=1&b=2");
240252/// ```
241253impl core:: fmt:: Display for UrlSearchParams {
@@ -254,7 +266,7 @@ where
254266 ///```
255267 /// use ada_url::UrlSearchParams;
256268 /// let mut params = UrlSearchParams::parse("a=1&b=2")
257- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
269+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
258270 /// assert_eq!(params.len(), 2);
259271 /// params.extend([("foo", "bar")]);
260272 /// assert_eq!(params.len(), 3);
@@ -281,14 +293,15 @@ where
281293 /// ```
282294 fn from_iter < T : IntoIterator < Item = ( Input , Input ) > > ( iter : T ) -> Self {
283295 let mut params = UrlSearchParams :: parse ( "" )
284- . expect ( "Failed to parse empty string. This is likely due to a bug" ) ;
296+ . expect ( "Should be able to parse empty string. This is likely due to a bug" ) ;
285297 for item in iter {
286298 params. append ( item. 0 . as_ref ( ) , item. 1 . as_ref ( ) ) ;
287299 }
288300 params
289301 }
290302}
291303
304+ #[ derive( Hash ) ]
292305pub struct UrlSearchParamsKeyIterator < ' a > {
293306 iterator : * mut ffi:: ada_url_search_params_keys_iter ,
294307 _phantom : core:: marker:: PhantomData < & ' a str > ,
@@ -314,6 +327,7 @@ impl<'a> Iterator for UrlSearchParamsKeyIterator<'a> {
314327 }
315328}
316329
330+ #[ derive( Hash ) ]
317331pub struct UrlSearchParamsValueIterator < ' a > {
318332 iterator : * mut ffi:: ada_url_search_params_values_iter ,
319333 _phantom : core:: marker:: PhantomData < & ' a str > ,
@@ -379,7 +393,7 @@ impl<'a> UrlSearchParamsEntry<'a> {
379393 /// ```
380394 /// use ada_url::UrlSearchParams;
381395 /// let params = UrlSearchParams::parse("a=1&b=2")
382- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
396+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
383397 /// let pairs = params.get_all("a");
384398 /// assert_eq!(pairs.is_empty(), false);
385399 /// ```
@@ -392,7 +406,7 @@ impl<'a> UrlSearchParamsEntry<'a> {
392406 /// ```
393407 /// use ada_url::UrlSearchParams;
394408 /// let params = UrlSearchParams::parse("a=1&b=2")
395- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
409+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
396410 /// let pairs = params.get_all("a");
397411 /// assert_eq!(pairs.len(), 1);
398412 /// ```
@@ -405,7 +419,7 @@ impl<'a> UrlSearchParamsEntry<'a> {
405419 /// ```
406420 /// use ada_url::UrlSearchParams;
407421 /// let params = UrlSearchParams::parse("a=1&a=2")
408- /// .expect("This is a valid UrlSearchParams. Should have parsed it .");
422+ /// .expect("String should have been able to be parsed into an UrlSearchParams .");
409423 /// let pairs = params.get_all("a");
410424 /// assert_eq!(pairs.len(), 2);
411425 /// assert_eq!(pairs.get(0), Some("1"));
@@ -446,6 +460,7 @@ impl<'a> From<UrlSearchParamsEntry<'a>> for Vec<&'a str> {
446460 }
447461}
448462
463+ #[ derive( Hash ) ]
449464pub struct UrlSearchParamsEntryIterator < ' a > {
450465 iterator : * mut ffi:: ada_url_search_params_entries_iter ,
451466 _phantom : core:: marker:: PhantomData < & ' a str > ,
0 commit comments