1- use crate :: ffi;
1+ use crate :: { ffi, ParseUrlError } ;
22
33pub struct URLSearchParams ( * mut ffi:: ada_url_search_params ) ;
44
@@ -13,19 +13,26 @@ impl URLSearchParams {
1313 ///
1414 /// ```
1515 /// use ada_url::URLSearchParams;
16- /// let params = URLSearchParams::parse("a=1&b=2");
16+ /// let params = URLSearchParams::parse("a=1&b=2")
17+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
1718 /// assert_eq!(params.get("a"), Some("1"));
1819 /// assert_eq!(params.get("b"), Some("2"));
1920 /// ```
20- pub fn parse ( input : & str ) -> Self {
21- Self ( unsafe { ffi:: ada_parse_search_params ( input. as_ptr ( ) . cast ( ) , input. len ( ) ) } )
21+ pub fn parse < Input > ( input : Input ) -> Result < Self , ParseUrlError < Input > >
22+ where
23+ Input : AsRef < str > ,
24+ {
25+ Ok ( Self ( unsafe {
26+ ffi:: ada_parse_search_params ( input. as_ref ( ) . as_ptr ( ) . cast ( ) , input. as_ref ( ) . len ( ) )
27+ } ) )
2228 }
2329
2430 /// Returns the size of the URLSearchParams struct.
2531 ///
2632 /// ```
2733 /// use ada_url::URLSearchParams;
28- /// let params = URLSearchParams::parse("a=1&b=2");
34+ /// let params = URLSearchParams::parse("a=1&b=2")
35+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
2936 /// assert_eq!(params.len(), 2);
3037 /// ```
3138 pub fn len ( & self ) -> usize {
@@ -60,7 +67,8 @@ impl URLSearchParams {
6067 ///
6168 /// ```
6269 /// use ada_url::URLSearchParams;
63- /// let mut params = URLSearchParams::parse("a=1&b=2");
70+ /// let mut params = URLSearchParams::parse("a=1&b=2")
71+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
6472 /// params.set("a", "3");
6573 /// assert_eq!(params.get("a"), Some("3"));
6674 /// ```
@@ -82,7 +90,8 @@ impl URLSearchParams {
8290 ///
8391 /// ```
8492 /// use ada_url::URLSearchParams;
85- /// let mut params = URLSearchParams::parse("a=1&b=2");
93+ /// let mut params = URLSearchParams::parse("a=1&b=2")
94+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
8695 /// params.remove("a", Some("1"));
8796 /// assert_eq!(params.get("a"), None);
8897 /// ```
@@ -106,7 +115,8 @@ impl URLSearchParams {
106115 ///
107116 /// ```
108117 /// use ada_url::URLSearchParams;
109- /// let params = URLSearchParams::parse("a=1&b=2");
118+ /// let params = URLSearchParams::parse("a=1&b=2")
119+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
110120 /// assert_eq!(params.contains("a", None), true);
111121 /// ```
112122 pub fn contains ( & self , key : & str , value : Option < & str > ) -> bool {
@@ -129,7 +139,8 @@ impl URLSearchParams {
129139 ///
130140 /// ```
131141 /// use ada_url::URLSearchParams;
132- /// let params = URLSearchParams::parse("a=1&b=2");
142+ /// let params = URLSearchParams::parse("a=1&b=2")
143+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
133144 /// assert_eq!(params.get("a"), Some("1"));
134145 /// assert_eq!(params.get("c"), None);
135146 /// ```
@@ -144,24 +155,12 @@ impl URLSearchParams {
144155 }
145156 }
146157
147- /// Returns the stringified version of the URLSearchParams struct.
148- ///
149- /// ```
150- /// use ada_url::URLSearchParams;
151- /// let params = URLSearchParams::parse("a=1&b=2");
152- /// assert_eq!(params.to_string(), "a=1&b=2");
153- /// ```
154- #[ cfg( feature = "std" ) ]
155- #[ allow( clippy:: inherent_to_string) ]
156- pub fn to_string ( & self ) -> String {
157- unsafe { ffi:: ada_search_params_to_string ( self . 0 ) . to_string ( ) }
158- }
159-
160158 /// Returns all values of the key.
161159 ///
162160 /// ```
163161 /// use ada_url::URLSearchParams;
164- /// let params = URLSearchParams::parse("a=1&a=2");
162+ /// let params = URLSearchParams::parse("a=1&a=2")
163+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
165164 /// let pairs = params.get_all("a");
166165 /// assert_eq!(pairs.len(), 2);
167166 /// ```
@@ -177,7 +176,8 @@ impl URLSearchParams {
177176 ///
178177 /// ```
179178 /// use ada_url::URLSearchParams;
180- /// let params = URLSearchParams::parse("a=1");
179+ /// let params = URLSearchParams::parse("a=1")
180+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
181181 /// let mut keys = params.keys();
182182 /// assert!(keys.has_next());
183183 pub fn keys ( & self ) -> URLSearchParamsKeysIterator {
@@ -189,7 +189,8 @@ impl URLSearchParams {
189189 ///
190190 /// ```
191191 /// use ada_url::URLSearchParams;
192- /// let params = URLSearchParams::parse("a=1");
192+ /// let params = URLSearchParams::parse("a=1")
193+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
193194 /// let mut values = params.values();
194195 /// assert!(values.has_next());
195196 pub fn values ( & self ) -> URLSearchParamsValuesIterator {
@@ -198,6 +199,31 @@ impl URLSearchParams {
198199 }
199200}
200201
202+ #[ cfg( feature = "std" ) ]
203+ impl core:: str:: FromStr for URLSearchParams {
204+ type Err = ParseUrlError < Box < str > > ;
205+
206+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
207+ Self :: parse ( s) . map_err ( |ParseUrlError { input } | ParseUrlError {
208+ input : input. into ( ) ,
209+ } )
210+ }
211+ }
212+
213+ /// Returns the stringified version of the URLSearchParams struct.
214+ ///
215+ /// ```
216+ /// use ada_url::URLSearchParams;
217+ /// let params = URLSearchParams::parse("a=1&b=2")
218+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
219+ /// assert_eq!(params.to_string(), "a=1&b=2");
220+ /// ```
221+ impl core:: fmt:: Display for URLSearchParams {
222+ fn fmt ( & self , f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
223+ f. write_str ( unsafe { ffi:: ada_search_params_to_string ( self . 0 ) . as_ref ( ) } )
224+ }
225+ }
226+
201227pub struct URLSearchParamsKeysIterator < ' a > {
202228 iterator : * mut ffi:: ada_url_search_params_keys_iter ,
203229 _phantom : core:: marker:: PhantomData < & ' a str > ,
@@ -291,7 +317,8 @@ impl<'a> URLSearchParamsEntry<'a> {
291317 ///
292318 /// ```
293319 /// use ada_url::URLSearchParams;
294- /// let params = URLSearchParams::parse("a=1&b=2");
320+ /// let params = URLSearchParams::parse("a=1&b=2")
321+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
295322 /// let pairs = params.get_all("a");
296323 /// assert_eq!(pairs.is_empty(), false);
297324 /// ```
@@ -303,7 +330,8 @@ impl<'a> URLSearchParamsEntry<'a> {
303330 ///
304331 /// ```
305332 /// use ada_url::URLSearchParams;
306- /// let params = URLSearchParams::parse("a=1&b=2");
333+ /// let params = URLSearchParams::parse("a=1&b=2")
334+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
307335 /// let pairs = params.get_all("a");
308336 /// assert_eq!(pairs.len(), 1);
309337 /// ```
@@ -315,7 +343,8 @@ impl<'a> URLSearchParamsEntry<'a> {
315343 ///
316344 /// ```
317345 /// use ada_url::URLSearchParams;
318- /// let params = URLSearchParams::parse("a=1&a=2");
346+ /// let params = URLSearchParams::parse("a=1&a=2")
347+ /// .expect("This is a valid URLSearchParams. Should have parsed it.");
319348 /// let pairs = params.get_all("a");
320349 /// assert_eq!(pairs.len(), 2);
321350 /// assert_eq!(pairs.get(0), Some("1"));
0 commit comments