serde-xml-rs 0.8.2

xml-rs based deserializer for Serde (compatible with 1.0)
Documentation
use super::{plain::PlainTextSerializer, writer::Writer};
use crate::error::{Error, Result};
use serde::ser::{SerializeTuple, SerializeTupleStruct, SerializeTupleVariant};
use std::io::Write;

pub struct TupleSerializer<'a, W> {
    writer: &'a mut Writer<W>,
    buffer: Vec<String>,
    should_end_element: bool,
}

impl<'a, W> TupleSerializer<'a, W> {
    pub fn new(writer: &'a mut Writer<W>, should_end_element: bool) -> Self {
        Self {
            writer,
            buffer: Vec::new(),
            should_end_element,
        }
    }
}

impl<W: Write> SerializeTuple for TupleSerializer<'_, W> {
    type Ok = ();
    type Error = Error;

    fn serialize_element<T>(&mut self, value: &T) -> Result<()>
    where
        T: ?Sized + serde::Serialize,
    {
        if let Some(text) = value.serialize(PlainTextSerializer)? {
            self.buffer.push(text);
        }
        Ok(())
    }

    fn end(self) -> Result<Self::Ok> {
        self.writer.characters(self.buffer.join(" ").as_str())?;
        if self.should_end_element {
            self.writer.end_element()?;
        }
        Ok(())
    }
}

impl<W: Write> SerializeTupleStruct for TupleSerializer<'_, W> {
    type Ok = ();
    type Error = Error;

    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
    where
        T: ?Sized + serde::Serialize,
    {
        <Self as SerializeTuple>::serialize_element(self, value)
    }

    fn end(self) -> Result<Self::Ok> {
        <Self as SerializeTuple>::end(self)
    }
}

impl<W: Write> SerializeTupleVariant for TupleSerializer<'_, W> {
    type Ok = ();
    type Error = Error;

    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
    where
        T: ?Sized + serde::Serialize,
    {
        <Self as SerializeTuple>::serialize_element(self, value)
    }

    fn end(self) -> Result<Self::Ok> {
        self.writer.characters(self.buffer.join(" ").as_str())?;
        self.writer.end_element()?;
        if self.should_end_element {
            self.writer.end_element()?;
        }
        Ok(())
    }
}