url_params_serializer 0.1.1

Allows serialization of types to URL GET parameters
Documentation
use serde::de::value::Error as SerdeError;
use serde::ser;
use serde::ser::Serialize;

use crate::param_serializer_trait::ParamSerializer;

pub struct Wrap<T>(pub T);

macro_rules! add_scalar_value {
    ($fn_name:ident, $type:ty) => {
        fn $fn_name(self, val: $type) -> Result<Self::Ok, Self::Error> {
            self.0.add_value(val.to_string());
            Ok(())
        }
    }
}

impl<T: ParamSerializer> ser::Serializer for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    type SerializeSeq = Self;
    type SerializeTuple = Self::SerializeSeq;
    type SerializeTupleStruct = Self::SerializeSeq;
    type SerializeTupleVariant = Self::SerializeSeq;
    type SerializeMap = Self;
    type SerializeStruct = Self::SerializeMap;
    type SerializeStructVariant = Self::SerializeMap;

    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
        self.0.add_value(if v { "true" } else { "false" });
        Ok(())
    }

    add_scalar_value!(serialize_i8, i8);
    add_scalar_value!(serialize_i16, i16);
    add_scalar_value!(serialize_i32, i32);
    add_scalar_value!(serialize_i64, i64);
    add_scalar_value!(serialize_i128, i128);
    add_scalar_value!(serialize_u8, u8);
    add_scalar_value!(serialize_u16, u16);
    add_scalar_value!(serialize_u32, u32);
    add_scalar_value!(serialize_u64, u64);
    add_scalar_value!(serialize_u128, u128);
    add_scalar_value!(serialize_f32, f32);
    add_scalar_value!(serialize_f64, f64);
    add_scalar_value!(serialize_char, char);

    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
        self.0.add_value(v);
        Ok(())
    }

    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
        use serde::ser::SerializeSeq;
        let mut seq = self.serialize_seq(Some(v.len())).unwrap();
        for byte in v {
            seq.serialize_element(byte).unwrap();
        }
        seq.end().unwrap();

        Ok(())
    }

    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
        Ok(())
    }

    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
        Ok(())
    }

    fn serialize_unit_variant(
        self,
        _name: &'static str,
        _variant_index: u32,
        variant: &'static str,
    ) -> Result<Self::Ok, Self::Error> {
        self.0.add_value(variant);
        Ok(())
    }

    fn serialize_newtype_struct<U>(
        self,
        _name: &'static str,
        value: &U,
    ) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        value.serialize(self)
    }

    fn serialize_newtype_variant<U>(
        self,
        _name: &'static str,
        _variant_index: u32,
        variant: &'static str,
        value: &U,
    ) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        let Wrap(inner) = self;
        inner.push_key(variant);
        value.serialize(&mut *self).unwrap();
        self.0.pop_key();
        Ok(())
    }

    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
        Ok(())
    }

    fn serialize_some<U>(self, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        value.serialize(self)
    }

    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
        self.0.start_seq();
        Ok(self)
    }

    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
        self.0.start_seq();
        Ok(self)
    }

    fn serialize_tuple_struct(
        self,
        _name: &'static str,
        _len: usize,
    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
        self.0.start_seq();
        Ok(self)
    }

    fn serialize_tuple_variant(
        self,
        _name: &'static str,
        _variant_index: u32,
        variant: &'static str,
        _len: usize,
    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
        self.0.push_key(variant);
        self.0.start_seq();
        Ok(self)
    }

    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
        self.0.start_map();
        Ok(self)
    }

    fn serialize_struct(
        self,
        _name: &'static str,
        _len: usize,
    ) -> Result<Self::SerializeStruct, Self::Error> {
        self.0.start_map();
        Ok(self)
    }

    fn serialize_struct_variant(
        self,
        _name: &'static str,
        _variant_index: u32,
        variant: &'static str,
        _len: usize,
    ) -> Result<Self::SerializeStructVariant, Self::Error> {
        self.0.push_key(variant);
        self.0.start_map();
        Ok(self)
    }

    fn is_human_readable(&self) -> bool {
        true
    }
}

impl<'a, T: ParamSerializer> ser::SerializeSeq for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    fn serialize_element<U>(&mut self, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        value.serialize(&mut **self)
    }

    fn end(self) -> Result<Self::Ok, Self::Error> {
        self.0.end_seq();
        Ok(())
    }
}

impl<'a, T: ParamSerializer> ser::SerializeTuple for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    fn serialize_element<U>(&mut self, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        value.serialize(&mut **self)
    }

    fn end(self) -> Result<Self::Ok, Self::Error> {
        self.0.end_seq();
        Ok(())
    }
}

impl<T: ParamSerializer> ser::SerializeTupleStruct for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    fn serialize_field<U>(&mut self, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        value.serialize(&mut **self)
    }

    fn end(self) -> Result<Self::Ok, Self::Error> {
        self.0.end_seq();
        Ok(())
    }
}

impl<T: ParamSerializer> ser::SerializeTupleVariant for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    fn serialize_field<U>(&mut self, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        value.serialize(&mut **self).unwrap();
        Ok(())
    }

    fn end(self) -> Result<Self::Ok, Self::Error> {
        self.0.end_seq();
        self.0.pop_key();
        Ok(())
    }
}

impl<T: ParamSerializer> ser::SerializeMap for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    fn serialize_key<U>(&mut self, key: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        self.0.push_key(key);
        Ok(())
    }

    fn serialize_value<U>(&mut self, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        value.serialize(&mut **self).unwrap();
        self.0.pop_key();
        Ok(())
    }

    fn end(self) -> Result<Self::Ok, Self::Error> {
        Ok(())
    }
}

impl<T: ParamSerializer> ser::SerializeStruct for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    fn serialize_field<U>(&mut self, key: &'static str, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        self.0.push_key(key);
        value.serialize(&mut **self).unwrap();
        self.0.pop_key();
        Ok(())
    }

    fn end(self) -> Result<Self::Ok, Self::Error> {
        Ok(())
    }
}

impl<T: ParamSerializer> ser::SerializeStructVariant for &mut Wrap<T> {
    type Ok = ();
    type Error = SerdeError;

    fn serialize_field<U>(&mut self, key: &'static str, value: &U) -> Result<Self::Ok, Self::Error>
    where
        U: ?Sized + Serialize,
    {
        self.0.push_key(key);
        value.serialize(&mut **self).unwrap();
        self.0.pop_key();
        Ok(())
    }

    fn end(self) -> Result<Self::Ok, Self::Error> {
        self.0.pop_key();
        Ok(())
    }
}