Skip to content

Commit

Permalink
update parse method and apply recommendations
Browse files Browse the repository at this point in the history
  • Loading branch information
anonrig committed Dec 1, 2024
1 parent 9b46978 commit bced8d0
Showing 1 changed file with 57 additions and 28 deletions.
85 changes: 57 additions & 28 deletions src/url_search_params.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::ffi;
use crate::{ffi, ParseUrlError};

pub struct URLSearchParams(*mut ffi::ada_url_search_params);

Expand All @@ -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: Input) -> Result<Self, ParseUrlError<Input>>
where
Input: AsRef<str>,
{
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 {
Expand Down Expand Up @@ -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"));
/// ```
Expand All @@ -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);
/// ```
Expand All @@ -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 {
Expand All @@ -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);
/// ```
Expand All @@ -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);
/// ```
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -198,6 +199,31 @@ impl URLSearchParams {
}
}

#[cfg(feature = "std")]
impl core::str::FromStr for URLSearchParams {
type Err = ParseUrlError<Box<str>>;

fn from_str(s: &str) -> Result<Self, Self::Err> {
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>,
Expand Down Expand Up @@ -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);
/// ```
Expand All @@ -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);
/// ```
Expand All @@ -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"));
Expand Down

0 comments on commit bced8d0

Please sign in to comment.