use std::fs::{write, File}; use std::io; use anyhow::{Result, anyhow}; use csv::Reader; #[derive(Clone)] pub struct FrameTiming { pub pts_ms: Option, pub dts_ms: u64, } #[derive(Clone)] pub struct RecordedFrame { pub timing: FrameTiming, pub frame: F } #[derive(Clone, Default)] pub struct Recording { pub frames: Vec> } impl Recording { pub fn new() -> Recording { Self { frames: Vec::new() } } pub fn push(&mut self, ite: RecordedFrame) { self.frames.push(ite); } } pub trait CsvExporter { type Error: std::error::Error + Send + Sync + 'static; fn csv_header(&self, recording: &Recording) -> Vec; fn csv_row(&self, item: &RecordedFrame) -> anyhow::Result>; } // TODO: CsvImporter pub trait CsvImporter

{ fn load(&mut self, reader: R) -> anyhow::Result>; } pub fn write_csv( recording: &Recording, exporter: &E, path: &str // mut writer: W, ) -> anyhow::Result<()> where E: CsvExporter, // W: std::io::Write { let header = exporter.csv_header(&recording); // let mut wrt = csv::Writer::from_writer(io::stdout()); let mut wrt = csv::Writer::from_path(format!("{}.csv", path))?; wrt.write_record(header)?; for f in &recording.frames { let row = exporter.csv_row(f)?; wrt.write_record(&row)?; } wrt.flush()?; Ok(()) }