Skip to content

Commit 1793feb

Browse files
committed
update parse method and apply recommendations
1 parent be6b796 commit 1793feb

File tree

1 file changed

+57
-28
lines changed

1 file changed

+57
-28
lines changed

src/url_search_params.rs

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::ffi;
1+
use crate::{ffi, ParseUrlError};
22

33
pub 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+
201227
pub 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

Comments
 (0)