use std::io::{BufWriter, Write}; use crate::Error; pub trait GenTableValue { fn gen_table_value(&self) -> String; } impl GenTableValue for u8 { fn gen_table_value(&self) -> String { format!("{self}") } } impl GenTableValue for u32 { fn gen_table_value(&self) -> String { format!("{self}") } } impl GenTableValue for usize { fn gen_table_value(&self) -> String { format!("{self}") } } impl<T0, T1> GenTableValue for (T0, T1) where T0: GenTableValue, T1: GenTableValue, { fn gen_table_value(&self) -> String { format!( "({},{})", self.0.gen_table_value(), self.1.gen_table_value() ) } } impl<T0, T1, T2> GenTableValue for (T0, T1, T2) where T0: GenTableValue, T1: GenTableValue, T2: GenTableValue, { fn gen_table_value(&self) -> String { format!( "({},{},{})", self.0.gen_table_value(), self.1.gen_table_value(), self.2.gen_table_value(), ) } } pub trait GenTable { fn gen_table<W>(&self, name: String, buffer: &mut BufWriter<W>) -> Result<(), Error> where W: Write; } impl<T> GenTable for Vec<T> where T: GenTableValue, { fn gen_table<W>(&self, name: String, buffer: &mut BufWriter<W>) -> Result<(), Error> where W: Write, { write!( buffer, "pub static {}:[{};{}]=[", name, std::any::type_name::<T>(), self.len() )?; for (i, value) in self.iter().enumerate() { write!(buffer, "{},", value.gen_table_value())?; if i % 32 == 31 { writeln!(buffer)?; } } writeln!(buffer, "];")?; Ok(()) } }