chiark / gitweb /
item names: Launder OccultIlk too
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 29 Mar 2021 21:42:57 +0000 (22:42 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 29 Mar 2021 21:42:57 +0000 (22:42 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/gamestate.rs
src/occultilks.rs
src/shapelib.rs

index 1e8b2f1f47820d8793f2cc85941de569f15f783d..d6a9cb2658a2133f1b4632e9da00aefb97e6a1cf 100644 (file)
@@ -89,6 +89,48 @@ pub struct CommittedLogEntry {
   pub logent: LogEntry,
 }
 
+//---------- GoodItemName ----------
+
+mod item_name {
+  use super::*;
+  use shapelib::LibraryLoadError;
+  use LibraryLoadError as LLE;
+
+  #[derive(Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]
+  #[derive(Serialize,Deserialize)]
+  #[serde(transparent)]
+  pub struct GoodItemName(String);
+  impl Borrow<String> for GoodItemName {
+    fn borrow(&self) -> &String { &self.0 }
+  }
+  impl GoodItemName {
+    pub fn as_str(&self) -> &str { &self.0 }
+  }
+  impl From<GoodItemName> for String {
+    fn from(i: GoodItemName) -> String { i.0 }
+  }
+  impl Display for GoodItemName {
+    #[throws(fmt::Error)]
+    fn fmt(&self, f: &mut fmt::Formatter) { f.write_str(&self.0)? }
+  }
+
+  impl TryFrom<String> for GoodItemName {
+    type Error = LibraryLoadError;
+    #[throws(LibraryLoadError)]
+    fn try_from(s: String) -> GoodItemName {
+      if s.as_bytes().iter().all(|&c:&u8| (
+        c.is_ascii_alphanumeric() ||
+        b"-_. ()".contains(&c)
+      )) {
+        GoodItemName(s)
+      } else {
+        throw!(LLE::BadItemName(s))
+      }
+    }
+  }
+}
+pub use item_name::*;
+
 // ---------- piece trait, and rendering ----------
 
 #[typetag::serde(tag="type")]
index 1d2567e6d9b8b249ef6f2353b1949399bb7d4b57..7bf9fc9bcbeb57484328c66705aec4d0ef9dbe42 100644 (file)
@@ -14,7 +14,7 @@ pub struct OccultIlkOwningId(Id);
 #[derive(Debug,Clone,Eq,PartialEq,Ord,PartialOrd,Hash)]
 #[derive(Serialize,Deserialize)]
 #[serde(transparent)]
-pub struct OccultIlkName(pub Arc<String>);
+pub struct OccultIlkName(pub Arc<GoodItemName>);
 
 #[derive(Debug,Serialize,Deserialize)]
 pub struct OccultIlkData {
index 1908bdbc665d47692572096483de7be705c69a21..24a26d2d92a62df7b0447ca1d7400aef47635831 100644 (file)
@@ -60,51 +60,13 @@ enum OccData {
 #[allow(non_camel_case_types)]
 #[derive(Debug)]
 struct OccData_Internal {
-  item_name: Arc<String>,
+  item_name: Arc<GoodItemName>,
   outline: Outline,
   desc: Html,
   xform: FaceTransform,
   svgd: parking_lot::Mutex<Option<Arc<Html>>>,
 }
 
-mod item_name {
-  use super::*;
-
-  #[derive(Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]
-  #[derive(Serialize,Deserialize)]
-  #[serde(transparent)]
-  pub struct GoodItemName(String);
-  impl Borrow<String> for GoodItemName {
-    fn borrow(&self) -> &String { &self.0 }
-  }
-  impl GoodItemName {
-    pub fn as_str(&self) -> &str { &self.0 }
-  }
-  impl From<GoodItemName> for String {
-    fn from(i: GoodItemName) -> String { i.0 }
-  }
-  impl Display for GoodItemName {
-    #[throws(fmt::Error)]
-    fn fmt(&self, f: &mut fmt::Formatter) { f.write_str(&self.0)? }
-  }
-
-  impl TryFrom<String> for GoodItemName {
-    type Error = LibraryLoadError;
-    #[throws(LibraryLoadError)]
-    fn try_from(s: String) -> GoodItemName {
-      if s.as_bytes().iter().all(|&c:&u8| (
-        c.is_ascii_alphanumeric() ||
-        b"-_. ()".contains(&c)
-      )) {
-        GoodItemName(s)
-      } else {
-        throw!(LLE::BadItemName(s))
-      }
-    }
-  }
-}
-pub use item_name::*;
-
 #[derive(Error,Debug)]
 pub enum LibraryLoadError {
   #[error(transparent)]
@@ -461,7 +423,8 @@ impl Contents {
           let svgd = match svgd {
             Some(svgd) => svgd.clone(),
             None => {
-              let occ_data = self.load_svg(&occ.item_name, &name)?;
+              let occ_data = self.load_svg(occ.item_name.as_str(),
+                                           name.as_str())?;
               let occ_data = Arc::new(occ_data);
               *svgd = Some(occ_data.clone());
               occ_data
@@ -683,8 +646,9 @@ fn load_catalogue(libname: &str, dirname: &str, toml_path: &str) -> Contents {
             throw!(LLE::OccultationColourMissing(colour.0.clone()));
           }
           let colour: Colour = colour.try_into()?;
+          let item_name = subst(item_name.as_str(), "_c", &colour.0)?;
           OccData::Internal(Arc::new(OccData_Internal {
-            item_name: Arc::new(subst(item_name.as_str(), "_c", &colour.0)?),
+            item_name: Arc::new(item_name.try_into()?),
             desc: Html(subst(&fe.desc.0, "_colour", "")?),
             outline: outline.clone(),
             xform: FaceTransform::from_group(&group.d)?,