use std::{fmt::Debug, io::{Read, Cursor}};
use log::debug;
use crate::Error;
pub trait Resource: Debug + ToString {
fn get_mime_type(&self) -> String;
fn sub(&self, s: &str, mime_type: &str) -> Result<Box<dyn Resource>, Error>;
fn open(&self) -> Result<Box<dyn Read>, Error>;
fn read_to_memory(&self) -> Result<Vec<u8>, Error> {
let mut buffer: Vec<u8> = Vec::new();
let mut writer = Cursor::new(&mut buffer);
let mut reader = self.open()?;
match std::io::copy(reader.as_mut(), &mut writer) {
Err(err) => {
Err(Error::IO(format!("Failed copying {:?} to memory due to {}", self, err)))
}
Ok(l) => {
debug!("Copied {} bytes to memory", l);
Ok(buffer)
}
}
}
}