Skip to main content

scratch_test_model/scopes/
target.rs

1use super::target_data::{TargetLists, TargetVariables};
2use crate::aux::WithJsonContextExt as _;
3use crate::error::TargetError;
4use crate::scopes::TargetBlocks;
5use crate::scopes::target_procedures::TargetProcedures;
6
7/// A target is a sprite or the background
8///
9/// This models a [file format's target object](https://en.scratch-wiki.info/wiki/Scratch_File_Format#Targets)
10/// while focussing on the relevant parts for this application.
11#[derive(Debug, derive_getters::Getters, PartialEq)]
12pub struct Target {
13    is_stage: bool,
14    name: String,
15    variables: TargetVariables,
16    lists: TargetLists,
17    // broadcasts: (), // not implemented yet
18    // comments: (),   // not implemented yet
19    blocks: TargetBlocks,
20    procedures: TargetProcedures,
21}
22
23impl Target {
24    pub(crate) fn from_json(value: &serde_json::Value) -> Result<Self, TargetError<'_>> {
25        let is_stage = value
26            .get("isStage")
27            .and_then(|s| s.as_bool())
28            .ok_or(TargetError::MissingIsStage)?;
29        let name = value
30            .get("name")
31            .and_then(|s| s.as_str())
32            .ok_or(TargetError::MissingName)?
33            .into();
34        let variables = TargetVariables::from_json.with_ctx(&value["variables"])?;
35        let lists = TargetLists::from_json.with_ctx(&value["lists"])?;
36        let blocks = TargetBlocks::from_json(&value["blocks"])?;
37        let procedures = TargetProcedures::new(&blocks);
38
39        Ok(Self {
40            is_stage,
41            name,
42            variables,
43            lists,
44            blocks,
45            procedures,
46        })
47    }
48}