From 847232cd4129a653c8992229c6d86e8be3c911ef Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 4 May 2022 22:20:47 +0100 Subject: [PATCH] materials format: Plumb through to load_catalogue Signed-off-by: Ian Jackson --- src/bundles.rs | 14 +++++++++++--- src/shapelib.rs | 19 +++++++++++++++++++ src/spec.rs | 3 +++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/bundles.rs b/src/bundles.rs index 8776f252..5e674919 100644 --- a/src/bundles.rs +++ b/src/bundles.rs @@ -304,7 +304,7 @@ impl Display for State { fn fmt(&self, f: &mut Formatter) { match self { State::Loaded(Loaded{ meta, size, hash }) => { - let BundleMeta { title } = meta; + let BundleMeta { title, mformat:_ } = meta; write!(f, "Loaded {:10} {} {:?}", size, hash, title)?; } other => write!(f, "{:?}", other)?, @@ -335,7 +335,7 @@ impl MgmtBundleList { } let bundles = self.iter().filter_map(|(&id, state)| { if_let!{ State::Loaded(Loaded { meta,.. }) = state; else return None; } - let BundleMeta { title } = meta; + let BundleMeta { title, mformat:_ } = meta; let title = Html::from_txt(title); let token = id.token(ig); let url = hformat!("/_/bundle/{}/{}?{}", &*ig.name, &id, &token); @@ -568,7 +568,8 @@ fn parse_bundle(id: Id, instance: &InstanceName, Ok::<_,LE>(meta) }, ||{ BundleMeta { - title: "[bundle metadata could not be reloaded]".to_owned() + title: "[bundle metadata could not be reloaded]".to_owned(), + mformat: materials_format::Version::CURRENT, // dummy value } })?; @@ -629,6 +630,7 @@ fn parse_bundle(id: Id, instance: &InstanceName, svg_dir: &'l String, need_svgs: Vec, id: &'l Id, + mformat: materials_format::Version, } impl shapelib::LibrarySource for LibraryInBundle<'_> { @@ -646,6 +648,11 @@ fn parse_bundle(id: Id, instance: &InstanceName, self.need_svgs.push(SvgNoted { item, src_name }); } fn bundle(&self) -> Option { Some(*self.id) } + + #[throws(materials_format::VersionError)] + fn default_materials_format(&self) -> materials_format::Version { + self.mformat + } } for LibScanned { libname, dir_inzip, inzip } in libs { @@ -661,6 +668,7 @@ fn parse_bundle(id: Id, instance: &InstanceName, svg_dir: &svg_dir, need_svgs: Vec::new(), id: &id, + mformat: meta.mformat, }; let contents = shapelib::load_catalogue(&libname, &mut src) .map_err(|e| LE::badlib(&libname, &e))?; diff --git a/src/shapelib.rs b/src/shapelib.rs index 6b10f56b..281b608c 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -119,6 +119,7 @@ pub enum LibraryLoadError { #[error("{0}")] BadSubstitution(#[from] SubstError), #[error("{0}")] UnsupportedColourSpec(#[from] UnsupportedColourSpec), #[error("bad item name (invalid characters) in {0:?}")] BadItemName(String), + #[error("{0:?}")] MaterialsFormatVersionError(#[from] MFVE), } #[derive(Error,Copy,Clone,Debug)] @@ -741,6 +742,9 @@ pub trait LibrarySource { fn note_svg(&mut self, _basename: &GoodItemName, _src_name: Result<&str, &SubstError>) { } fn bundle(&self) -> Option; + + fn default_materials_format(&self) + -> Result; } struct BuiltinLibrary<'l> { @@ -752,6 +756,12 @@ impl LibrarySource for BuiltinLibrary<'_> { fn catalogue_data(&self) -> &str { self.catalogue_data } fn svg_dir(&self) -> String { self.dirname.to_string() } fn bundle(&self) -> Option { None } + + #[throws(materials_format::VersionError)] + fn default_materials_format(&self) -> materials_format::Version { + materials_format::Version::CURRENT + //throw!(MFVE::Other("builtin libraries must have explicit version now!")); + } } #[throws(LibraryLoadError)] @@ -760,6 +770,15 @@ pub fn load_catalogue(libname: &str, src: &mut dyn LibrarySource) let toplevel: toml::Value = src.catalogue_data().parse()?; let toplevel = toplevel .as_table().ok_or_else(|| LLE::ExpectedTable(format!("toplevel")))?; + let mformat = match toplevel.get("format") { + None => src.default_materials_format()?, + Some(v) => { + let v = v.as_integer().ok_or_else(|| MFVE::Other("not an integer"))?; + materials_format::Version::try_from_integer(v)? + }, + }; + let _: materials_format::Version = mformat; + let mut l = Catalogue { bundle: src.bundle(), libname: libname.to_string(), diff --git a/src/spec.rs b/src/spec.rs index 9140795e..c5ca4019 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -29,6 +29,7 @@ use otter_base::hformat_as_display; use crate::accounts::AccountName; use crate::error::UnsupportedColourSpec; use crate::gamestate::PieceSpec; +use crate::materials_format; use crate::prelude::default; use crate::utils::SVGSizeError; @@ -121,6 +122,8 @@ pub enum SpecError { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct BundleMeta { pub title: String, + #[serde(default, rename="format")] + pub mformat: materials_format::Version, } //---------- Table TOML file ---------- -- 2.30.2