http-path-params 0.2.0

HTTP Path Params
Documentation
use alloc::string::{String, ToString as _};
use core::{fmt::Display, str::FromStr};

use crate::{PathParam, PathParams};

use super::ValueSetError;

impl<T> PathParams for PathParam<T>
where
    T: FromStr + Display + Clone + Default + Send + Sync + 'static,
    <T as FromStr>::Err: Display,
{
    fn size(&self) -> usize {
        1
    }
    fn value(&self, index: usize) -> String {
        match index {
            0 => self.0.to_string(),
            _ => panic!(),
        }
    }
    fn set_value(&mut self, index: usize, value: &str) -> Result<(), ValueSetError> {
        match index {
            0 => {
                self.0 = value
                    .parse::<T>()
                    .map_err(|err| ValueSetError::ParseFailed(err.to_string()))?;
                Ok(())
            }
            _ => panic!(),
        }
    }
}

impl<T1, T2> PathParams for (PathParam<T1>, PathParam<T2>)
where
    T1: FromStr + Display + Clone + Default + Send + Sync + 'static,
    <T1 as FromStr>::Err: Display,
    T2: FromStr + Display + Clone + Default + Send + Sync + 'static,
    <T2 as FromStr>::Err: Display,
{
    fn size(&self) -> usize {
        2
    }
    fn value(&self, index: usize) -> String {
        match index {
            0 => self.0 .0.to_string(),
            1 => self.1 .0.to_string(),
            _ => panic!(),
        }
    }
    fn set_value(&mut self, index: usize, value: &str) -> Result<(), ValueSetError> {
        match index {
            0 => {
                self.0 .0 = value
                    .parse::<T1>()
                    .map_err(|err| ValueSetError::ParseFailed(err.to_string()))?;
                Ok(())
            }
            1 => {
                self.1 .0 = value
                    .parse::<T2>()
                    .map_err(|err| ValueSetError::ParseFailed(err.to_string()))?;
                Ok(())
            }
            _ => panic!(),
        }
    }
}

impl<T1, T2, T3> PathParams for (PathParam<T1>, PathParam<T2>, PathParam<T3>)
where
    T1: FromStr + Display + Clone + Default + Send + Sync + 'static,
    <T1 as FromStr>::Err: Display,
    T2: FromStr + Display + Clone + Default + Send + Sync + 'static,
    <T2 as FromStr>::Err: Display,
    T3: FromStr + Display + Clone + Default + Send + Sync + 'static,
    <T3 as FromStr>::Err: Display,
{
    fn size(&self) -> usize {
        3
    }
    fn value(&self, index: usize) -> String {
        match index {
            0 => self.0 .0.to_string(),
            1 => self.1 .0.to_string(),
            2 => self.2 .0.to_string(),
            _ => panic!(),
        }
    }
    fn set_value(&mut self, index: usize, value: &str) -> Result<(), ValueSetError> {
        match index {
            0 => {
                self.0 .0 = value
                    .parse::<T1>()
                    .map_err(|err| ValueSetError::ParseFailed(err.to_string()))?;
                Ok(())
            }
            1 => {
                self.1 .0 = value
                    .parse::<T2>()
                    .map_err(|err| ValueSetError::ParseFailed(err.to_string()))?;
                Ok(())
            }
            2 => {
                self.2 .0 = value
                    .parse::<T3>()
                    .map_err(|err| ValueSetError::ParseFailed(err.to_string()))?;
                Ok(())
            }
            _ => panic!(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    use alloc::vec;

    #[test]
    fn test_get_and_set_values() {
        //
        let mut path_params: PathParam<usize> = Default::default();
        path_params.set_values(&["1".to_string()]).unwrap();
        assert_eq!(path_params, PathParam(1));
        assert_eq!(path_params.values(), vec!["1".to_string()]);

        //
        let mut path_params: (PathParam<usize>, PathParam<String>) = Default::default();
        path_params
            .set_values(&["1".to_string(), "foo".to_string()])
            .unwrap();
        assert_eq!(path_params, (PathParam(1), PathParam("foo".to_string())));
        assert_eq!(
            path_params.values(),
            vec!["1".to_string(), "foo".to_string()]
        );

        //
        let mut path_params: (PathParam<usize>, PathParam<String>, PathParam<bool>) =
            Default::default();
        path_params
            .set_values(&["1".to_string(), "foo".to_string(), "true".to_string()])
            .unwrap();
        assert_eq!(
            path_params,
            (PathParam(1), PathParam("foo".to_string()), PathParam(true))
        );
        assert_eq!(
            path_params.values(),
            vec!["1".to_string(), "foo".to_string(), "true".to_string()]
        );
    }
}