use crate::prelude::*;
#[derive(Debug,Deserialize)]
pub struct GroupDefn {
pub files: FileList,
#[serde(default)] pub item_prefix: String,
#[serde(default)] pub item_suffix: String,
#[serde(default)] pub sort: String,
#[serde(flatten)] pub d: GroupDetails,
}
#[derive(Debug,Deserialize)]
pub struct GroupDetails {
#[cfg(doc)] inherit: String, #[serde(default)] pub size: Vec<f64>, #[serde(default)] pub orig_size: Vec<f64>,
#[serde(default)] pub centre: Option<[f64; 2]>,
#[serde(default)] pub flip: bool,
#[serde(default)] pub back: Option<Box <dyn PieceSpec>>,
#[serde(default)] pub scale: Option<ScaleDetails>,
#[serde(default)] pub colours: HashMap<String, RecolourData>,
pub desc_template: Option<String>,
pub occulted: Option<OccultationMethod>,
pub outline: OutlineDetails,
#[serde(default)] pub magic: Option<MagicDetails>,
}
#[derive(Debug,Deserialize)]
pub struct MagicDetails {
#[serde(default)] pub item_prefix: String,
#[serde(default)] pub item_suffix: String,
pub template: String,
#[serde(default)] pub substs: HashMap<String,String>,
}
#[derive(Debug,Deserialize,Copy,Clone)]
#[serde(untagged)]
pub enum ScaleDetails {
Fit(ScaleFitDetails),
Scale(f64),
Stretch([f64;2]),
}
#[derive(Debug,Deserialize,Copy,Clone)]
pub enum ScaleFitDetails { Fit, Cover, Stretch }
#[derive(Debug,Deserialize)]
#[serde(untagged)]
pub enum OutlineDetails {
Full(FullOutlineDetails), Shape(Shape),
}
#[derive(Debug,Deserialize)]
pub struct FullOutlineDetails {
shape: Shape,
#[serde(default)] size: Vec<f64>,
#[serde(default)] scale: Option<f64>,
}
impl OutlineDetails {
pub fn shape(&self) -> Shape { match self {
OutlineDetails::Full(full) => full.shape,
OutlineDetails::Shape(shape) => *shape,
}}
pub fn size_scale(&self) -> (&[f64], Option<&f64>) { match self {
OutlineDetails::Full(full) => (&full.size, full.scale.as_ref()),
OutlineDetails::Shape(_) => default(),
}}
}
#[derive(Deserialize,Clone,Debug)]
#[serde(tag="method")]
pub enum OccultationMethod {
ByColour {
colour: ColourSpec,
},
ByBack {
ilk: OccultIlkName,
},
}
#[derive(Debug,Deserialize)]
pub struct RecolourData {
pub abbrev: String,
#[cfg(doc)] pub map: HashMap<String, String>,
#[serde(default)] pub substs: HashMap<String,String>,
}
#[doc(hidden)]
#[derive(Deserialize,Debug)]
#[serde(try_from="String")]
pub struct FileList(pub Vec<FileData>);
#[derive(Deserialize,Debug)]
pub struct FileData {
pub item_spec: String,
pub src_file_spec: String,
pub extra_fields: HashMap<String, String>,
pub desc: String,
}
#[cfg(doc)]
pub struct Scraper {
pub method: String,
}
#[cfg(doc)]
pub struct WikimediaScraper {
pub method: String,
}