chiark / gitweb /
materials format: Plumb through to load_catalogue
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 May 2022 21:20:47 +0000 (22:20 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 May 2022 22:30:02 +0000 (23:30 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bundles.rs
src/shapelib.rs
src/spec.rs

index 8776f252610aa8437634db12f682324480879867..5e674919fa0fc0bdb101a0f118269cae8b11db37 100644 (file)
@@ -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<EH>(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<EH>(id: Id, instance: &InstanceName,
     svg_dir: &'l String,
     need_svgs: Vec<SvgNoted>,
     id: &'l Id,
+    mformat: materials_format::Version,
   }
 
   impl shapelib::LibrarySource for LibraryInBundle<'_> {
@@ -646,6 +648,11 @@ fn parse_bundle<EH>(id: Id, instance: &InstanceName,
       self.need_svgs.push(SvgNoted { item, src_name });
     }
     fn bundle(&self) -> Option<bundles::Id> { 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<EH>(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))?;
index 6b10f56b4c2de9a88528119d7c00c5bbdcec44fa..281b608c6db0dd7bc8ea0327febdab72f062498f 100644 (file)
@@ -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<bundles::Id>;
+
+  fn default_materials_format(&self)
+                              -> Result<materials_format::Version, MFVE>;
 }
 
 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<bundles::Id> { 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(),
index 9140795eefd7a09a880a8da45c12f672722d3e9b..c5ca40191dfcefeb0e46d2bdee433e47bc8312a1 100644 (file)
@@ -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 ----------