use std::io::Cursor;
use format_ende::{FormatDecoder, FormatDecoderDyn, FormatEncoder, FormatEncoderDyn};
#[derive(Debug, PartialEq, Eq)]
struct Foo {
foo: i32,
}
struct BarFormat;
impl FormatEncoder<Foo> for BarFormat {
type EncodeError = std::io::Error;
fn encode(
&mut self,
mut writer: impl std::io::Write,
value: &Foo,
) -> Result<(), Self::EncodeError> {
writeln!(writer, "Foo: {}", value.foo)
}
}
impl FormatDecoder<Foo> for BarFormat {
type DecodeError = std::io::Error;
fn decode(&mut self, mut reader: impl std::io::Read) -> Result<Foo, Self::DecodeError> {
let mut str = String::new();
reader.read_to_string(&mut str)?;
let foo = str.trim().strip_prefix("Foo: ").unwrap().parse().unwrap();
Ok(Foo { foo })
}
}
fn main() {
let mut buf: Vec<u8> = Vec::new();
let mut format = BarFormat;
{
let format = &mut format as &mut dyn FormatEncoderDyn<Foo>;
format.encode_dyn(&mut buf, &Foo { foo: 42 }).unwrap();
}
{
let format = &mut format as &mut dyn FormatDecoderDyn<Foo>;
let value = format.decode_dyn(&mut Cursor::new(buf)).unwrap();
assert_eq!(value, Foo { foo: 42 });
}
}