ehttpd_querystring/
querystringext.rs

1//! Extension traits for `querystring::QueryString`
2
3use crate::querystring::QueryString;
4use ehttpd::error::Error;
5use std::{
6    borrow::{Borrow, Cow},
7    str::{self, FromStr},
8};
9
10/// Some query string extensions
11pub trait QueryStringExt<'a> {
12    fn get_str<K>(&self, key: &K) -> Result<Option<&str>, Error>
13    where
14        K: Ord + ?Sized,
15        Cow<'a, [u8]>: Borrow<K> + Ord;
16
17    /// Gets a value and converts it to the requested type
18    fn get_as<T, K>(&self, key: &K) -> Result<Option<T>, Error>
19    where
20        T: FromStr,
21        K: Ord + ?Sized,
22        Error: From<T::Err>,
23        Cow<'a, [u8]>: Borrow<K> + Ord;
24}
25impl<'a> QueryStringExt<'a> for QueryString<'a> {
26    fn get_str<K>(&self, key: &K) -> Result<Option<&str>, Error>
27    where
28        K: Ord + ?Sized,
29        Cow<'a, [u8]>: Borrow<K> + Ord,
30    {
31        // Get the value
32        let Some(value) = self.get(key) else {
33            // No value for this key
34            return Ok(None);
35        };
36
37        // Parse the value to a string
38        let value = str::from_utf8(value)?;
39        Ok(Some(value))
40    }
41
42    fn get_as<T, K>(&self, key: &K) -> Result<Option<T>, Error>
43    where
44        T: FromStr,
45        K: Ord + ?Sized,
46        Error: From<T::Err>,
47        Cow<'a, [u8]>: Borrow<K> + Ord,
48    {
49        // Get the value as string
50        let Some(value) = self.get_str(key)? else {
51            // No value for this key
52            return Ok(None);
53        };
54
55        // Parse the value
56        let parsed = value.parse()?;
57        Ok(Some(parsed))
58    }
59}