use std::collections::HashMap;
use serde::{Serialize, Serializer};
use serde::ser::SerializeStruct;
#[derive(Serialize)]
pub struct Project {
pub targets: Vec<Target>,
pub meta: ProjectMetadata,
}
#[derive(Serialize)]
pub struct ProjectMetadata {
pub semver: String,
pub vm: String,
pub agent: String,
}
#[derive(Serialize)]
pub struct Target {
pub id: String,
pub name: String,
pub isStage: bool,
pub x: i32,
pub y: i32,
pub size: i32,
pub direction: i32,
pub rotationStyle: String,
pub draggable: bool,
pub visible: bool,
pub blocks: HashMap<String, Block>,
pub variables: HashMap<String, Variable>,
pub lists: HashMap<String, List>,
pub currentCostume: i32,
pub costume: Costume,
pub costumes: Vec<Costume>,
pub costumeCount: i32,
pub sounds: Vec<Sound>,
}
#[derive(Serialize)]
pub struct Costume {
pub name: String,
pub assetId: String,
pub dataFormat: String,
pub bitmapResolution: i32,
pub rotationCenterX: i32,
pub rotationCenterY: i32,
pub skinId: i32,
}
#[derive(Serialize)]
pub struct Sound {
pub name: String,
pub assetId: String,
pub soundId: String,
pub dataFormat: String,
pub bitmapResolution: i32,
pub rotationCenterX: i32,
pub rotationCenterY: i32,
pub md5: String,
pub soundID: i32,
}
pub struct Variable {
pub id: String,
pub name: String,
pub value: f64, }
impl Serialize for Variable {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
let mut state = serializer.serialize_struct("Variable", 4)?;
state.serialize_field("id", &self.id)?;
state.serialize_field("name", &self.name)?;
state.serialize_field("value", &self.value)?;
let _ = state.serialize_field("type", &"");
state.end()
}
}
pub struct List {
pub id: String,
pub name: String,
pub value: Vec<f64>,
}
impl Serialize for List {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
let mut state = serializer.serialize_struct("List", 4)?;
state.serialize_field("id", &self.id)?;
state.serialize_field("name", &self.name)?;
state.serialize_field("value", &self.value)?;
let _ = state.serialize_field("type", &"list");
state.end()
}
}
#[derive(Serialize)]
pub struct Block {
pub id: String,
pub opcode: String,
pub inputs: HashMap<String, BlockInput>,
pub fields: HashMap<String, BlockField>,
pub topLevel: bool,
pub next: Option<String>,
pub parent: Option<String>,
pub shadow: bool,
pub x: i32,
pub y: i32,
}
#[derive(Serialize)]
pub struct BlockInput {
pub name: String,
pub block: String,
pub shadow: bool,
}
#[derive(Serialize)]
pub struct BlockField {
pub name: String,
pub value: String,
}
#[derive(Serialize)]
pub enum CompileResult {
Tree(Project),
Fail(String),
}