use crate::{decoder::RawProject, error::DecodeError, structs::Project};
pub struct Decoder {
archive: zip::ZipArchive<std::io::Cursor<Vec<u8>>>,
}
impl Decoder {
pub(super) fn new(bytes: Vec<u8>) -> Result<Self, DecodeError> {
let cursor = std::io::Cursor::new(bytes);
let archive = zip::ZipArchive::new(cursor)?;
Ok(Self { archive })
}
pub fn decode_raw(&mut self) -> Result<RawProject, DecodeError> {
let project_file = self.archive.by_name("project.json")?;
let raw_project: RawProject = serde_json::from_reader(project_file)?;
Ok(raw_project)
}
pub fn decode(&mut self) -> Result<Project, DecodeError> {
let raw_project = self.decode_raw()?;
let project = Project::new(raw_project, &mut self.archive)?;
Ok(project)
}
}