lib_contra/
formatter.rs

1use std::io;
2
3use crate::{
4    error::{AnyError, IoResult, SuccessResult},
5    position::Position,
6};
7
8macro_rules! decl_write_primitive {
9    ($type: ident, $ser_func: ident) => {
10        fn $ser_func(&mut self, write: &mut W, value: &$type) -> IoResult;
11    };
12}
13
14pub trait WriteFormatter<W: io::Write> {
15    fn write_struct_begin(&mut self, write: &mut W, name: &str, fields: usize) -> IoResult;
16    fn write_struct_end(&mut self, write: &mut W, name: &str) -> IoResult;
17
18    fn write_collection_begin(&mut self, write: &mut W, name: &str, size: usize) -> IoResult;
19    fn write_collection_end(&mut self, write: &mut W, name: &str) -> IoResult;
20
21    fn write_field_assignnment_begin(&mut self, write: &mut W) -> IoResult;
22    fn write_field_key(&mut self, write: &mut W, name: &str) -> IoResult;
23    fn write_field_assignnment_operator(&mut self, write: &mut W) -> IoResult;
24    fn write_field_assignnment_end(&mut self, write: &mut W, pos: &Position) -> IoResult;
25
26    decl_write_primitive!(i8, write_i8);
27    decl_write_primitive!(i16, write_i16);
28    decl_write_primitive!(i32, write_i32);
29    decl_write_primitive!(i64, write_i64);
30    decl_write_primitive!(i128, write_i128);
31    decl_write_primitive!(u8, write_u8);
32    decl_write_primitive!(u16, write_u16);
33    decl_write_primitive!(u32, write_u32);
34    decl_write_primitive!(u64, write_u64);
35    decl_write_primitive!(u128, write_u128);
36    decl_write_primitive!(f32, write_f32);
37    decl_write_primitive!(f64, write_f64);
38    decl_write_primitive!(usize, write_usize);
39    decl_write_primitive!(isize, write_isize);
40    decl_write_primitive!(str, write_str);
41}
42
43macro_rules! decl_read_primitive {
44    ($ttype: ident, $des_func: ident) => {
45        fn $des_func(&mut self, read: &mut R) -> Result<$ttype, AnyError>;
46    };
47}
48
49pub trait ReadFormatter<R: io::Read + io::Seek> {
50    fn read_struct_begin(&mut self, read: &mut R, name: &str, fields: usize) -> SuccessResult;
51    fn read_struct_end(&mut self, read: &mut R, name: &str) -> SuccessResult;
52
53    fn read_vec_begin(&mut self, read: &mut R, name: &str) -> SuccessResult;
54    fn read_vec_end(&mut self, read: &mut R, name: &str) -> SuccessResult;
55
56    fn read_field_assignnment_begin(&mut self, read: &mut R) -> SuccessResult;
57    fn read_field_key(&mut self, read: &mut R, name: &str) -> SuccessResult;
58    fn read_field_assignnment_operator(&mut self, read: &mut R) -> SuccessResult;
59    fn read_field_assignnment_end(&mut self, read: &mut R) -> SuccessResult;
60
61    decl_read_primitive!(i8, read_i8);
62    decl_read_primitive!(i16, read_i16);
63    decl_read_primitive!(i32, read_i32);
64    decl_read_primitive!(i64, read_i64);
65    decl_read_primitive!(i128, read_i128);
66    decl_read_primitive!(u8, read_u8);
67    decl_read_primitive!(u16, read_u16);
68    decl_read_primitive!(u32, read_u32);
69    decl_read_primitive!(u64, read_u64);
70    decl_read_primitive!(f32, read_f32);
71    decl_read_primitive!(f64, read_f64);
72    decl_read_primitive!(u128, read_u128);
73    decl_read_primitive!(usize, read_usize);
74    decl_read_primitive!(isize, read_isize);
75    decl_read_primitive!(String, read_string);
76}