use std::collections::BTreeMap;
use libhaystack::val::Value;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ProgramMeta {
pub name: String,
pub libs: Vec<String>,
pub ver: Option<String>,
pub description: Option<String>,
pub author: Option<String>,
pub license: Option<String>,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LinkData {
pub id: Option<String>,
pub source_block_uuid: String,
pub target_block_uuid: String,
pub source_block_pin_name: String,
pub target_block_pin_name: String,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct BlockData {
pub id: String,
pub name: String,
pub dis: String,
pub lib: String,
pub category: String,
pub ver: String,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Position {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PinValue {
pub value: Value,
#[serde(default)]
pub is_connected: bool,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ProgramBlock {
pub name: String,
pub lib: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub positions: Option<Position>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub inputs: BTreeMap<String, PinValue>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub outputs: BTreeMap<String, PinValue>,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct Program {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
pub blocks: BTreeMap<String, ProgramBlock>,
#[serde(default)]
pub links: BTreeMap<String, LinkData>,
}