use fountain_engine::traits::DataOperator;
use fountain_engine::types::Operation;
use std::io::Write;
pub struct IoDataOperator<W: Write> {
writer: W,
format: OperationFormat,
}
#[derive(Clone, Copy, Debug)]
pub enum OperationFormat {
Debug,
Custom,
}
impl<W: Write> IoDataOperator<W> {
pub fn new(writer: W) -> Self {
Self {
writer,
format: OperationFormat::Debug,
}
}
pub fn set_format(&mut self, format: OperationFormat) {
self.format = format;
}
fn write_operation(&mut self, operation: &Operation) -> std::io::Result<()> {
match self.format {
OperationFormat::Debug => {
writeln!(self.writer, "{:?}", operation)?;
}
OperationFormat::Custom => {
writeln!(self.writer, "{:?}", operation)?;
}
}
Ok(())
}
}
impl<W: Write> DataOperator for IoDataOperator<W> {
fn execute(&mut self, operation: &Operation) {
let _ = self.write_operation(operation);
}
}
impl IoDataOperator<std::io::Stdout> {
pub fn stdout() -> Self {
Self::new(std::io::stdout())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Cursor;
#[test]
fn test_io_data_operator_basic() {
let mut buffer = Vec::new();
{
let mut io_op = IoDataOperator::new(Cursor::new(&mut buffer));
io_op.execute(&Operation::EnsureZero {
list_id: vec![1, 2, 3],
});
let _ = io_op.writer.flush();
}
let output = String::from_utf8(buffer).unwrap();
assert!(output.contains("EnsureZero"));
assert!(output.contains("1"));
assert!(output.contains("2"));
assert!(output.contains("3"));
}
}