lib-contra 5.0.2

The function implementation of contra
Documentation
use std::io;

use crate::{
    error::{AnyError, IoResult, SuccessResult},
    position::Position,
};

macro_rules! decl_write_primitive {
    ($type: ident, $ser_func: ident) => {
        fn $ser_func(&mut self, write: &mut W, value: &$type) -> IoResult;
    };
}

pub trait WriteFormatter<W: io::Write> {
    fn write_struct_begin(&mut self, write: &mut W, name: &str, fields: usize) -> IoResult;
    fn write_struct_end(&mut self, write: &mut W, name: &str) -> IoResult;

    fn write_collection_begin(&mut self, write: &mut W, name: &str, size: usize) -> IoResult;
    fn write_collection_end(&mut self, write: &mut W, name: &str) -> IoResult;

    fn write_field_assignnment_begin(&mut self, write: &mut W) -> IoResult;
    fn write_field_key(&mut self, write: &mut W, name: &str) -> IoResult;
    fn write_field_assignnment_operator(&mut self, write: &mut W) -> IoResult;
    fn write_field_assignnment_end(&mut self, write: &mut W, pos: &Position) -> IoResult;

    decl_write_primitive!(i8, write_i8);
    decl_write_primitive!(i16, write_i16);
    decl_write_primitive!(i32, write_i32);
    decl_write_primitive!(i64, write_i64);
    decl_write_primitive!(i128, write_i128);
    decl_write_primitive!(u8, write_u8);
    decl_write_primitive!(u16, write_u16);
    decl_write_primitive!(u32, write_u32);
    decl_write_primitive!(u64, write_u64);
    decl_write_primitive!(u128, write_u128);
    decl_write_primitive!(f32, write_f32);
    decl_write_primitive!(f64, write_f64);
    decl_write_primitive!(usize, write_usize);
    decl_write_primitive!(isize, write_isize);
    decl_write_primitive!(str, write_str);
}

macro_rules! decl_read_primitive {
    ($ttype: ident, $des_func: ident) => {
        fn $des_func(&mut self, read: &mut R) -> Result<$ttype, AnyError>;
    };
}

pub trait ReadFormatter<R: io::Read + io::Seek> {
    fn read_struct_begin(&mut self, read: &mut R, name: &str, fields: usize) -> SuccessResult;
    fn read_struct_end(&mut self, read: &mut R, name: &str) -> SuccessResult;

    fn read_vec_begin(&mut self, read: &mut R, name: &str) -> SuccessResult;
    fn read_vec_end(&mut self, read: &mut R, name: &str) -> SuccessResult;

    fn read_field_assignnment_begin(&mut self, read: &mut R) -> SuccessResult;
    fn read_field_key(&mut self, read: &mut R, name: &str) -> SuccessResult;
    fn read_field_assignnment_operator(&mut self, read: &mut R) -> SuccessResult;
    fn read_field_assignnment_end(&mut self, read: &mut R) -> SuccessResult;

    decl_read_primitive!(i8, read_i8);
    decl_read_primitive!(i16, read_i16);
    decl_read_primitive!(i32, read_i32);
    decl_read_primitive!(i64, read_i64);
    decl_read_primitive!(i128, read_i128);
    decl_read_primitive!(u8, read_u8);
    decl_read_primitive!(u16, read_u16);
    decl_read_primitive!(u32, read_u32);
    decl_read_primitive!(u64, read_u64);
    decl_read_primitive!(f32, read_f32);
    decl_read_primitive!(f64, read_f64);
    decl_read_primitive!(u128, read_u128);
    decl_read_primitive!(usize, read_usize);
    decl_read_primitive!(isize, read_isize);
    decl_read_primitive!(String, read_string);
}