use std::collections::HashMap;
use zip::ZipArchive;
use crate::{
decoder::RawProject,
error::DecodeError,
structs::{Broadcast, Sprite, Stage, Target, Variable},
};
#[derive(Debug, Clone)]
pub struct Project {
pub sprites: Vec<Sprite>,
pub stage: Stage,
}
impl Project {
pub fn new(
raw: RawProject,
zip: &mut ZipArchive<std::io::Cursor<Vec<u8>>>,
) -> Result<Self, DecodeError> {
let mut sprites = Vec::new();
let mut stage = None;
for raw_target in raw.targets {
match Target::new(raw_target, zip)? {
Target::Sprite(sprite) => sprites.push(sprite),
Target::Stage(s) => stage = Some(s),
}
}
Ok(Self {
sprites,
stage: stage.ok_or(DecodeError::NotFound("Stage".to_string()))?,
})
}
pub fn global_variables(&self) -> &HashMap<String, Variable> {
&self.stage.variables
}
pub fn global_variables_mut(&mut self) -> &mut HashMap<String, Variable> {
&mut self.stage.variables
}
pub fn broadcasts(&self) -> Vec<Broadcast> {
self.stage.broadcasts.clone()
}
pub fn get(&self, name: &str) -> Option<&Sprite> {
self.sprites.iter().find(|sprite| sprite.name == name)
}
pub fn get_mut(&mut self, name: &str) -> Option<&mut Sprite> {
self.sprites.iter_mut().find(|sprite| sprite.name == name)
}
}