yaup 0.3.1

URL parameters serialization
Documentation
use crate::error::Result;
use std::io;

pub struct Serializer<'a, W> {
    writer: &'a mut W,
    first_param: bool,
}

impl<'a, W> Serializer<'a, W>
where
    W: io::Write,
{
    pub fn new(writer: &'a mut W) -> Self {
        Serializer {
            writer,
            first_param: true,
        }
    }
}

impl<'a, W> ::serde::ser::SerializeMap for Serializer<'a, W>
where
    W: io::Write,
{
    type Ok = ();
    type Error = crate::error::Error;

    fn serialize_key<T>(&mut self, key: &T) -> Result<()>
    where
        T: ?Sized + ::serde::ser::Serialize,
    {
        if self.first_param {
            self.first_param = false;
        } else {
            write!(self.writer, "&")?;
        }
        let simple = super::simple::Serializer::new_from_toplevel(&mut *self.writer);
        key.serialize(simple)?;
        write!(self.writer, "=")?;
        Ok(())
    }

    fn serialize_value<T>(&mut self, value: &T) -> Result<()>
    where
        T: ?Sized + ::serde::ser::Serialize,
    {
        let simple = super::simple::Serializer::new_from_toplevel(&mut *self.writer);
        value.serialize(simple)?;
        Ok(())
    }

    fn end(self) -> Result<()> {
        Ok(())
    }
}

impl<'a, W> ::serde::ser::SerializeStruct for Serializer<'a, W>
where
    W: io::Write,
{
    type Ok = ();
    type Error = crate::error::Error;

    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
    where
        T: ?Sized + ::serde::ser::Serialize,
    {
        if self.first_param {
            self.first_param = false;
        } else {
            write!(self.writer, "&")?;
        }
        write!(self.writer, "{key}=")?;
        let simple = super::simple::Serializer::new_from_toplevel(&mut *self.writer);
        value.serialize(simple)?;
        Ok(())
    }

    fn end(self) -> Result<()> {
        Ok(())
    }
}

impl<'a, W> ::serde::ser::SerializeStructVariant for Serializer<'a, W>
where
    W: io::Write,
{
    type Ok = ();
    type Error = crate::error::Error;

    fn serialize_field<T>(
        &mut self,
        key: &'static str,
        value: &T,
    ) -> std::prelude::v1::Result<(), Self::Error>
    where
        T: ?Sized + serde::Serialize,
    {
        ::serde::ser::SerializeStruct::serialize_field(self, key, value)
    }

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