use crate::error::ModelError;
use crate::model::Model;
use std::io::{Read, Write};
use std::path::Path;
pub trait Codec {
fn name(&self) -> &'static str;
fn extensions(&self) -> &'static [&'static str];
fn detect(&self, _bytes: &[u8]) -> bool {
false
}
fn read_bytes(&self, bytes: &[u8]) -> Result<Model, ModelError>;
fn read_owned(&self, bytes: Vec<u8>) -> Result<Model, ModelError> {
self.read_bytes(&bytes)
}
fn write(&self, model: &Model, out: &mut dyn Write) -> Result<(), ModelError>;
fn read_from(&self, reader: &mut dyn Read) -> Result<Model, ModelError> {
let mut buf = Vec::new();
reader
.read_to_end(&mut buf)
.map_err(|e| ModelError::Io(e.to_string()))?;
self.read_owned(buf)
}
fn read_path(&self, path: &Path) -> Result<Model, ModelError> {
let bytes = std::fs::read(path).map_err(|e| ModelError::Io(e.to_string()))?;
self.read_bytes(&bytes)
}
fn write_path(&self, model: &Model, path: &Path) -> Result<(), ModelError> {
let mut file = std::fs::File::create(path).map_err(|e| ModelError::Io(e.to_string()))?;
self.write(model, &mut file)
}
fn write_bytes(&self, model: &Model) -> Result<Vec<u8>, ModelError> {
let mut out = Vec::new();
self.write(model, &mut out)?;
Ok(out)
}
}