use std::collections::BTreeMap;
use std::path::PathBuf;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize, Default, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct BoardConfig {
#[serde(default)]
pub entry: Option<PathBuf>,
#[serde(default, alias = "out-dir")]
pub out_dir: Option<PathBuf>,
#[serde(default, alias = "circuit-json")]
pub circuit_json: Option<PathBuf>,
#[serde(default)]
pub port: Option<u16>,
#[serde(default)]
pub mcu: Option<String>,
#[serde(default)]
pub kicad: Option<PathBuf>,
}
#[derive(Debug, Clone, Deserialize, Default, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct FirmwareConfig {
#[serde(default)]
pub path: Option<PathBuf>,
#[serde(default)]
pub framework: Option<String>,
#[serde(default, alias = "pins-rs")]
pub pins_rs: Option<PathBuf>,
#[serde(default, alias = "build-cmd")]
pub build_cmd: Option<String>,
#[serde(default)]
pub board: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Default, PartialEq)]
pub struct BodyConfig {
#[serde(default)]
pub source: Option<PathBuf>,
#[serde(default)]
pub build: Option<String>,
#[serde(default)]
pub generate: Option<String>,
#[serde(default, alias = "around")]
pub board: Option<String>,
#[serde(flatten)]
pub enclosure: EnclosureConfig,
}
#[derive(Debug, Clone, Deserialize, Default, PartialEq)]
pub struct EnclosureConfig {
#[serde(default)]
pub format: Option<String>,
#[serde(default, alias = "out-dir")]
pub out_dir: Option<PathBuf>,
#[serde(default, alias = "wall-thickness")]
pub wall_thickness: Option<f64>,
#[serde(default)]
pub height: Option<f64>,
#[serde(default)]
pub cutouts: Option<bool>,
#[serde(default)]
pub ventilation: Option<String>,
#[serde(default)]
pub mounting: Option<bool>,
}
#[derive(Debug, Clone, Deserialize, Default, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct PlacementConfig {
#[serde(default)]
pub at: Option<[f64; 3]>,
#[serde(default)]
pub rotate: Option<[f64; 3]>,
}
#[derive(Debug, Clone, Deserialize, Default, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct AssemblyConfig {
#[serde(default, alias = "out-dir")]
pub out_dir: Option<PathBuf>,
#[serde(default)]
pub format: Option<String>,
#[serde(default)]
pub parts: BTreeMap<String, PlacementConfig>,
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum PinId {
Number(u32),
Name(String),
}
impl std::fmt::Display for PinId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Number(n) => write!(f, "{n}"),
Self::Name(name) => f.write_str(name),
}
}
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct WireConfig {
pub a: PinId,
pub b: PinId,
#[serde(default)]
pub net: Option<String>,
#[serde(default)]
pub nets: Option<[String; 2]>,
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct LinkConfig {
pub from: String,
pub to: String,
#[serde(default)]
pub wires: Vec<WireConfig>,
}