diff --git a/src/url_search_params.rs b/src/url_search_params.rs index b0e6614..d8c8bd2 100644 --- a/src/url_search_params.rs +++ b/src/url_search_params.rs @@ -1,4 +1,4 @@ -use crate::ffi; +use crate::{ffi, ParseUrlError}; pub struct URLSearchParams(*mut ffi::ada_url_search_params); @@ -13,19 +13,26 @@ impl URLSearchParams { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&b=2"); + /// let params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// assert_eq!(params.get("a"), Some("1")); /// assert_eq!(params.get("b"), Some("2")); /// ``` - pub fn parse(input: &str) -> Self { - Self(unsafe { ffi::ada_parse_search_params(input.as_ptr().cast(), input.len()) }) + pub fn parse(input: Input) -> Result> + where + Input: AsRef, + { + Ok(Self(unsafe { + ffi::ada_parse_search_params(input.as_ref().as_ptr().cast(), input.as_ref().len()) + })) } /// Returns the size of the URLSearchParams struct. /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&b=2"); + /// let params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// assert_eq!(params.len(), 2); /// ``` pub fn len(&self) -> usize { @@ -60,7 +67,8 @@ impl URLSearchParams { /// /// ``` /// use ada_url::URLSearchParams; - /// let mut params = URLSearchParams::parse("a=1&b=2"); + /// let mut params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// params.set("a", "3"); /// assert_eq!(params.get("a"), Some("3")); /// ``` @@ -82,7 +90,8 @@ impl URLSearchParams { /// /// ``` /// use ada_url::URLSearchParams; - /// let mut params = URLSearchParams::parse("a=1&b=2"); + /// let mut params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// params.remove("a", Some("1")); /// assert_eq!(params.get("a"), None); /// ``` @@ -106,7 +115,8 @@ impl URLSearchParams { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&b=2"); + /// let params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// assert_eq!(params.contains("a", None), true); /// ``` pub fn contains(&self, key: &str, value: Option<&str>) -> bool { @@ -129,7 +139,8 @@ impl URLSearchParams { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&b=2"); + /// let params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// assert_eq!(params.get("a"), Some("1")); /// assert_eq!(params.get("c"), None); /// ``` @@ -144,24 +155,12 @@ impl URLSearchParams { } } - /// Returns the stringified version of the URLSearchParams struct. - /// - /// ``` - /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&b=2"); - /// assert_eq!(params.to_string(), "a=1&b=2"); - /// ``` - #[cfg(feature = "std")] - #[allow(clippy::inherent_to_string)] - pub fn to_string(&self) -> String { - unsafe { ffi::ada_search_params_to_string(self.0).to_string() } - } - /// Returns all values of the key. /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&a=2"); + /// let params = URLSearchParams::parse("a=1&a=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// let pairs = params.get_all("a"); /// assert_eq!(pairs.len(), 2); /// ``` @@ -177,7 +176,8 @@ impl URLSearchParams { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1"); + /// let params = URLSearchParams::parse("a=1") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// let mut keys = params.keys(); /// assert!(keys.has_next()); pub fn keys(&self) -> URLSearchParamsKeysIterator { @@ -189,7 +189,8 @@ impl URLSearchParams { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1"); + /// let params = URLSearchParams::parse("a=1") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// let mut values = params.values(); /// assert!(values.has_next()); pub fn values(&self) -> URLSearchParamsValuesIterator { @@ -198,6 +199,31 @@ impl URLSearchParams { } } +#[cfg(feature = "std")] +impl core::str::FromStr for URLSearchParams { + type Err = ParseUrlError>; + + fn from_str(s: &str) -> Result { + Self::parse(s).map_err(|ParseUrlError { input }| ParseUrlError { + input: input.into(), + }) + } +} + +/// Returns the stringified version of the URLSearchParams struct. +/// +/// ``` +/// use ada_url::URLSearchParams; +/// let params = URLSearchParams::parse("a=1&b=2") +/// .expect("This is a valid URLSearchParams. Should have parsed it."); +/// assert_eq!(params.to_string(), "a=1&b=2"); +/// ``` +impl core::fmt::Display for URLSearchParams { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str(unsafe { ffi::ada_search_params_to_string(self.0).as_ref() }) + } +} + pub struct URLSearchParamsKeysIterator<'a> { iterator: *mut ffi::ada_url_search_params_keys_iter, _phantom: core::marker::PhantomData<&'a str>, @@ -291,7 +317,8 @@ impl<'a> URLSearchParamsEntry<'a> { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&b=2"); + /// let params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// let pairs = params.get_all("a"); /// assert_eq!(pairs.is_empty(), false); /// ``` @@ -303,7 +330,8 @@ impl<'a> URLSearchParamsEntry<'a> { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&b=2"); + /// let params = URLSearchParams::parse("a=1&b=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// let pairs = params.get_all("a"); /// assert_eq!(pairs.len(), 1); /// ``` @@ -315,7 +343,8 @@ impl<'a> URLSearchParamsEntry<'a> { /// /// ``` /// use ada_url::URLSearchParams; - /// let params = URLSearchParams::parse("a=1&a=2"); + /// let params = URLSearchParams::parse("a=1&a=2") + /// .expect("This is a valid URLSearchParams. Should have parsed it."); /// let pairs = params.get_all("a"); /// assert_eq!(pairs.len(), 2); /// assert_eq!(pairs.get(0), Some("1"));