serde-ply 0.2.2

A Serde-based PLY (Polygon File Format) serializer and deserializer
Documentation
use std::fmt::Display;
use std::io::Write;
use std::marker::PhantomData;

use byteorder::ByteOrder;
use byteorder::WriteBytesExt;

use crate::SerializeError;

pub(crate) struct BinValWriter<W: Write, E: ByteOrder> {
    writer: W,
    _endian: PhantomData<E>,
}

impl<W: Write, E: ByteOrder> BinValWriter<W, E> {
    pub(crate) fn new(writer: W) -> Self {
        Self {
            writer,
            _endian: PhantomData,
        }
    }
}

pub(crate) struct AsciiValWriter<W: Write> {
    writer: W,
    first_in_row: bool,
}

impl<W: Write> AsciiValWriter<W> {
    pub(crate) fn new(writer: W) -> Self {
        Self {
            writer,
            first_in_row: true,
        }
    }
}

pub(crate) trait ScalarWriter {
    fn write_i8(&mut self, val: i8) -> Result<(), SerializeError>;
    fn write_u8(&mut self, val: u8) -> Result<(), SerializeError>;
    fn write_i16(&mut self, val: i16) -> Result<(), SerializeError>;
    fn write_u16(&mut self, val: u16) -> Result<(), SerializeError>;
    fn write_i32(&mut self, val: i32) -> Result<(), SerializeError>;
    fn write_u32(&mut self, val: u32) -> Result<(), SerializeError>;
    fn write_f32(&mut self, val: f32) -> Result<(), SerializeError>;
    fn write_f64(&mut self, val: f64) -> Result<(), SerializeError>;

    fn write_row_end(&mut self) -> Result<(), SerializeError>;
}

impl<W: Write, E: ByteOrder> ScalarWriter for BinValWriter<W, E> {
    fn write_i8(&mut self, val: i8) -> Result<(), SerializeError> {
        Ok(self.writer.write_i8(val)?)
    }

    fn write_u8(&mut self, val: u8) -> Result<(), SerializeError> {
        Ok(self.writer.write_u8(val)?)
    }

    fn write_i16(&mut self, val: i16) -> Result<(), SerializeError> {
        Ok(self.writer.write_i16::<E>(val)?)
    }

    fn write_u16(&mut self, val: u16) -> Result<(), SerializeError> {
        Ok(self.writer.write_u16::<E>(val)?)
    }

    fn write_i32(&mut self, val: i32) -> Result<(), SerializeError> {
        Ok(self.writer.write_i32::<E>(val)?)
    }

    fn write_u32(&mut self, val: u32) -> Result<(), SerializeError> {
        Ok(self.writer.write_u32::<E>(val)?)
    }

    fn write_f32(&mut self, val: f32) -> Result<(), SerializeError> {
        Ok(self.writer.write_f32::<E>(val)?)
    }

    fn write_f64(&mut self, val: f64) -> Result<(), SerializeError> {
        Ok(self.writer.write_f64::<E>(val)?)
    }

    fn write_row_end(&mut self) -> Result<(), SerializeError> {
        Ok(())
    }
}

impl<W: Write> AsciiValWriter<W> {
    #[inline]
    fn write_field(&mut self, val: impl Display) -> Result<(), SerializeError> {
        if !self.first_in_row {
            self.writer.write_all(b" ")?;
        }
        self.first_in_row = false;
        write!(self.writer, "{val}")?;
        Ok(())
    }
}

impl<W: Write> ScalarWriter for AsciiValWriter<W> {
    fn write_i8(&mut self, val: i8) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_u8(&mut self, val: u8) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_i16(&mut self, val: i16) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_u16(&mut self, val: u16) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_i32(&mut self, val: i32) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_u32(&mut self, val: u32) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_f32(&mut self, val: f32) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_f64(&mut self, val: f64) -> Result<(), SerializeError> {
        self.write_field(val)
    }

    fn write_row_end(&mut self) -> Result<(), SerializeError> {
        self.writer.write_all(b"\n")?;
        self.first_in_row = true;
        Ok(())
    }
}