use std::fs::File;
use std::io::Read;
use std::path::Path;
use crate::serialization::serializable::Serialized;
use crate::serialization::error::SerializationError;
use crate::serialization::error::SerializationError::InvalidDataError;
pub trait Deserializable: Sized {
fn from_serialized(serialized: &Serialized) -> Result<(Self, usize), SerializationError>;
fn from_file(fpath: &Path) -> Result<Self, SerializationError>{
let metadata = fpath.metadata();
if metadata.is_err(){
return Err(InvalidDataError("No such file"));
}
let metadata = metadata.unwrap();
if !metadata.is_file(){
return Err(InvalidDataError("Not a file"));
}
let mut data = Serialized::new();
let mut file = File::open(fpath).expect("Can not open file");
File::read_to_end(&mut file, &mut data).expect("Can not read file");
let result = Self::from_serialized(&data);
if result.is_ok(){
let (obj, _) = result.unwrap();
Ok(obj)
}else{
Err(result.err().unwrap())
}
}
}