From dab7671b07d14599beb7866cc7a510bdacf11b95 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 6 Apr 2021 01:12:41 +0100 Subject: [PATCH] pcaliases: split out Signed-off-by: Ian Jackson --- src/global.rs | 6 ----- src/lib.rs | 1 + src/pcaliases.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ src/prelude.rs | 1 + src/shapelib.rs | 37 -------------------------- 5 files changed, 71 insertions(+), 43 deletions(-) create mode 100644 src/pcaliases.rs diff --git a/src/global.rs b/src/global.rs index 1910b218..01126f39 100644 --- a/src/global.rs +++ b/src/global.rs @@ -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>; - #[derive(Debug,Serialize,Deserialize)] pub struct IPiece { pub p: IPieceTraitObj, diff --git a/src/lib.rs b/src/lib.rs index f2109a9d..73d51a29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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 index 00000000..5344d40a --- /dev/null +++ b/src/pcaliases.rs @@ -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>; + +#[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) { + self.fwd.insert(alias, target); + } + + pub fn keys(&self) -> impl Iterator { + 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 { + self.resolve(pcaliases)?.load_occult(&default())? + } +} + diff --git a/src/prelude.rs b/src/prelude.rs index accc5773..dd2d8c79 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -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; diff --git a/src/shapelib.rs b/src/shapelib.rs index 2419fcb3..00708391 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -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 { - self.resolve(pcaliases)?.load_occult(&default())? - } -} - #[typetag::serde(name="Lib")] impl PieceSpec for ItemSpec { #[throws(SpecError)] -- 2.30.2