use crate::error::BabbelError;
use crate::io::traits::IDestination;
use crate::model::Value;
pub trait FormatParser {
fn parse_str(&self, input: &str) -> Result<Value, BabbelError>;
fn parse_bytes(&self, input: &[u8]) -> Result<Value, BabbelError> {
match core::str::from_utf8(input) {
Ok(s) => self.parse_str(s),
Err(_) => Err(BabbelError::encoding("input is not valid UTF-8")),
}
}
}
pub trait FormatEmitter {
fn emit(&self, value: &Value, dest: &mut dyn IDestination) -> Result<(), BabbelError>;
fn emit_pretty(
&self,
value: &Value,
dest: &mut dyn IDestination,
indent: usize,
) -> Result<(), BabbelError> {
let _ = indent;
self.emit(value, dest)
}
}
pub trait FormatCodec: FormatParser + FormatEmitter {
fn format_name(&self) -> &'static str;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct JsonEmitter;
impl FormatEmitter for JsonEmitter {
fn emit(&self, value: &Value, dest: &mut dyn IDestination) -> Result<(), BabbelError> {
value.serialize_json(dest);
Ok(())
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct YamlEmitter;
impl FormatEmitter for YamlEmitter {
fn emit(&self, value: &Value, dest: &mut dyn IDestination) -> Result<(), BabbelError> {
value.serialize_yaml(dest, 0);
Ok(())
}
fn emit_pretty(
&self,
value: &Value,
dest: &mut dyn IDestination,
indent: usize,
) -> Result<(), BabbelError> {
value.serialize_yaml(dest, indent);
Ok(())
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct XmlEmitter;
impl FormatEmitter for XmlEmitter {
fn emit(&self, value: &Value, dest: &mut dyn IDestination) -> Result<(), BabbelError> {
value.serialize_xml(dest, None);
Ok(())
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct BencodeEmitter;
impl FormatEmitter for BencodeEmitter {
fn emit(&self, value: &Value, dest: &mut dyn IDestination) -> Result<(), BabbelError> {
value.serialize_bencode(dest);
Ok(())
}
}