use std::collections::BTreeMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, JsonSchema)]
pub(crate) struct Manifest {
#[serde(default = "default_manifest_version")]
pub(crate) version: u8,
#[serde(default)]
pub(crate) packages: BTreeMap<String, Package>,
#[serde(default)]
pub(crate) groups: BTreeMap<String, Group>,
#[serde(default)]
pub(crate) features: BTreeMap<String, Vec<String>>,
#[serde(default)]
pub(crate) expose: BTreeMap<String, String>,
#[serde(default)]
pub(crate) targets: Vec<Target>,
#[serde(default)]
pub(crate) assets: Vec<Asset>,
#[serde(default)]
pub(crate) naming: Naming,
}
fn default_manifest_version() -> u8 {
1
}
impl Default for Manifest {
fn default() -> Self {
Self {
version: default_manifest_version(),
packages: BTreeMap::new(),
groups: BTreeMap::new(),
features: BTreeMap::new(),
expose: BTreeMap::new(),
targets: Vec::new(),
assets: Vec::new(),
naming: Naming::default(),
}
}
}
#[derive(Default, Serialize, Deserialize, JsonSchema)]
pub(crate) struct Naming {
#[serde(default)]
pub(crate) prefixes: BTreeMap<String, String>,
#[serde(default)]
pub(crate) case: Case,
}
#[derive(Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
#[derive(Default)]
pub(crate) enum Case {
#[default]
ScreamingSnake,
Snake,
}
#[derive(Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub(crate) enum LottieMode {
Direct,
Apng,
}
#[derive(Default, Serialize, Deserialize, JsonSchema, Clone)]
pub(crate) struct ExportOptions {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub(crate) sizes: Vec<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) color_space: Option<String>,
#[serde(default)]
pub(crate) premultiplied: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) compression: Option<String>,
}
#[derive(Default, Serialize, Deserialize, JsonSchema, Clone)]
pub(crate) struct FontOptions {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) glyphs: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub(crate) sizes: Vec<u32>,
#[serde(default)]
pub(crate) hinting: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) packing: Option<String>,
}
#[derive(Serialize, Deserialize, JsonSchema)]
pub(crate) struct Asset {
#[serde(default)]
pub(crate) name: String,
pub(crate) path: String,
pub(crate) hash: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) license: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) lottie: Option<LottieMode>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) frame_delay_ms: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) loop_count: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) export: Option<ExportOptions>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) font: Option<FontOptions>,
}
#[derive(Default, Serialize, Deserialize, JsonSchema)]
pub(crate) struct Group {
#[serde(default)]
pub(crate) assets: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) license: Option<String>,
}
#[derive(Serialize, Deserialize, JsonSchema)]
pub(crate) struct Preset {
pub(crate) width: u16,
pub(crate) height: u16,
pub(crate) color_depth: u8,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) storage: Option<String>,
}
#[derive(Serialize, Deserialize, JsonSchema)]
pub(crate) struct Target {
pub(crate) name: String,
pub(crate) vendor_dir: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) preset: Option<Preset>,
}
#[derive(Serialize)]
pub(crate) struct FeatureEntry {
pub(crate) name: String,
pub(crate) deps: Vec<String>,
}
#[derive(Default, Serialize, Deserialize, JsonSchema)]
pub(crate) struct Package {
#[serde(default)]
pub(crate) assets: Vec<String>,
}