chiark / gitweb /
pcaliases: split out
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 6 Apr 2021 00:12:41 +0000 (01:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 6 Apr 2021 19:22:04 +0000 (20:22 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/global.rs
src/lib.rs
src/pcaliases.rs [new file with mode: 0644]
src/prelude.rs
src/shapelib.rs

index 1910b2183a8afb28a8bf3bcfa2c67b06f8b971ea..01126f391977fac9666037a3be58d5a4223f28fc 100644 (file)
@@ -1,7 +1,3 @@
-// Copyright 2020-2021 Ian Jackson and contributors to Otter
-// SPDX-License-Identifier: AGPL-3.0-or-later
-// There is NO WARRANTY.
-
 #![allow(clippy::let_and_return)]
 
 use crate::prelude::*;
@@ -70,8 +66,6 @@ pub struct IPlayer { // usual variable: ipl
   pub tz: Timezone,
 }
 
-pub type PieceAliases = BTreeMap<String, Box<dyn PieceSpec>>;
-
 #[derive(Debug,Serialize,Deserialize)]
 pub struct IPiece {
   pub p: IPieceTraitObj,
index f2109a9d9a824ed641d57af1a6882d3b156822e1..73d51a29eae8e189a8f88b819fd49c0c261a7617 100644 (file)
@@ -25,6 +25,7 @@ pub mod mgmtchannel;
 pub mod nwtemplates;
 pub mod occultilks;
 pub mod organise;
+pub mod pcaliases;
 pub mod pcrender;
 pub mod pieces;
 pub mod shapelib;
diff --git a/src/pcaliases.rs b/src/pcaliases.rs
new file mode 100644 (file)
index 0000000..5344d40
--- /dev/null
@@ -0,0 +1,69 @@
+// Copyright 2020-2021 Ian Jackson and contributors to Otter
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// There is NO WARRANTY.
+
+use crate::prelude::*;
+
+type Fwd = BTreeMap<String, Box<dyn PieceSpec>>;
+
+#[derive(Debug,Default,Serialize,Deserialize)]
+#[serde(transparent)]
+pub struct PieceAliasesSave(Fwd);
+
+#[derive(Debug,Default,Serialize,Deserialize)]
+pub struct PieceAliases {
+  fwd: Fwd,
+}
+
+impl PieceAliases {
+  pub fn remove(&mut self, alias: &str) {
+    self.fwd.remove(alias);
+  }
+
+  pub fn insert(&mut self, alias: String, target: Box<dyn PieceSpec>) {
+    self.fwd.insert(alias, target);
+  }
+
+  pub fn keys(&self) -> impl Iterator<Item=&String> {
+    self.fwd.keys()
+  }
+}
+
+#[derive(Debug,Clone,Serialize,Deserialize)]
+struct Alias {
+  target: String,
+}
+
+impl Alias {
+  #[throws(SpecError)]
+  fn resolve<'a>(&self, pcaliases: &'a PieceAliases) -> &'a dyn PieceSpec {
+    Box::as_ref(
+      pcaliases
+        .fwd
+        .get(&self.target)
+        .ok_or(SpecError::AliasNotFound)?
+    )
+  }
+}
+
+#[typetag::serde]
+impl PieceSpec for Alias {
+  #[throws(SpecError)]
+  fn count(&self, pcaliases: &PieceAliases) -> usize {
+    // passing default() avoids resolving alias chains, so we don't
+    // have to worry about cycles
+    self.resolve(pcaliases)?.count(&default())?
+  }
+  #[throws(SpecError)]
+  fn load(&self, i: usize, gpc: &mut GPiece,
+          pcaliases: &PieceAliases, ir: &InstanceRef)
+          -> PieceSpecLoaded {
+    self.resolve(pcaliases)?.load(i, gpc, &default(), ir)?
+  }
+  #[throws(SpecError)]
+  fn load_occult(&self, pcaliases: &PieceAliases)
+                 -> Box<dyn OccultedPieceTrait> {
+    self.resolve(pcaliases)?.load_occult(&default())?
+  }
+}
+
index accc5773d8fad1989906dd1506f96b329100dea4..dd2d8c79ae9cb23b6037bd5abed1622e70095487 100644 (file)
@@ -135,6 +135,7 @@ pub use crate::mgmtchannel::*;
 pub use crate::nwtemplates;
 pub use crate::occultilks::*;
 pub use crate::organise;
+pub use crate::pcaliases::*;
 pub use crate::pcrender::*;
 pub use crate::pieces::*;
 pub use crate::shapelib;
index 2419fcb3124e488311014301abf756ba3bba7e9d..00708391cbd5cf78ec6a4974ba49d1db685e9968 100644 (file)
@@ -474,43 +474,6 @@ impl Contents {
   }
 }
 
-#[derive(Debug,Clone,Serialize,Deserialize)]
-struct Alias {
-  target: String,
-}
-
-impl Alias {
-  #[throws(SpecError)]
-  fn resolve<'a>(&self, pcaliases: &'a PieceAliases) -> &'a dyn PieceSpec {
-    Box::as_ref(
-      pcaliases
-        .get(&self.target)
-        .ok_or(SpecError::AliasNotFound)?
-    )
-  }
-}
-
-#[typetag::serde]
-impl PieceSpec for Alias {
-  #[throws(SpecError)]
-  fn count(&self, pcaliases: &PieceAliases) -> usize {
-    // passing default() avoids resolving alias chains, so we don't
-    // have to worry about cycles
-    self.resolve(pcaliases)?.count(&default())?
-  }
-  #[throws(SpecError)]
-  fn load(&self, i: usize, gpc: &mut GPiece,
-          pcaliases: &PieceAliases, ir: &InstanceRef)
-          -> PieceSpecLoaded {
-    self.resolve(pcaliases)?.load(i, gpc, &default(), ir)?
-  }
-  #[throws(SpecError)]
-  fn load_occult(&self, pcaliases: &PieceAliases)
-                 -> Box<dyn OccultedPieceTrait> {
-    self.resolve(pcaliases)?.load_occult(&default())?
-  }
-}
-
 #[typetag::serde(name="Lib")]
 impl PieceSpec for ItemSpec {
   #[throws(SpecError)]