chiark / gitweb /
piece aliases: Add to Instance
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 18:13:03 +0000 (18:13 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 19:18:17 +0000 (19:18 +0000)
Nothing populates this or looks at it.  We just save and restore it.

Acked-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/global.rs
src/prelude.rs

index 56dc8c54d7cc514971bf9f421d93bcbf0078a34b..d24bf57995d473a091a91b744090b22f98777d87 100644 (file)
@@ -49,6 +49,7 @@ pub struct Instance {
   pub name: Arc<InstanceName>,
   pub gs: GameState,
   pub ipieces: IPieces,
+  pub pcaliases: PieceAliases,
   pub ioccults: IOccults,
   pub clients: DenseSlotMap<ClientId, Client>,
   pub iplayers: SecondarySlotMap<PlayerId, PlayerRecord>,
@@ -71,6 +72,8 @@ 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,
@@ -230,9 +233,11 @@ pub struct InstanceContainer {
 }
 
 #[derive(Debug,Default,Serialize,Deserialize)]
-struct InstanceSaveAccesses<RawTokenStr, PiecesLoadedRef, OccultIlksRef> {
+struct InstanceSaveAccesses<RawTokenStr, PiecesLoadedRef, OccultIlksRef,
+                            PieceAliasesRef> {
   ipieces: PiecesLoadedRef,
   ioccults: OccultIlksRef,
+  pcaliases: PieceAliasesRef,
   tokens_players: Vec<(RawTokenStr, PlayerId)>,
   aplayers: SecondarySlotMap<PlayerId, IPlayer>,
   acl: Acl<TablePermission>,
@@ -324,6 +329,7 @@ impl Instance {
       name: name.clone(),
       gs, acl,
       ipieces: IPieces(default()),
+      pcaliases: default(),
       ioccults: default(),
       clients: default(),
       iplayers: default(),
@@ -998,6 +1004,7 @@ impl InstanceGuard<'_> {
     self.save_something("a-", |s, w| {
       let ipieces = &s.c.g.ipieces;
       let ioccults = &s.c.g.ioccults;
+      let pcaliases = &s.c.g.pcaliases;
       let tokens_players: Vec<(&str, PlayerId)> = {
         let global_players = GLOBAL.players.read().unwrap();
         s.c.g.tokens_players.tr
@@ -1016,6 +1023,7 @@ impl InstanceGuard<'_> {
       let links = s.c.g.links.clone();
       let isa = InstanceSaveAccesses {
         ipieces, ioccults, tokens_players, aplayers, acl, links,
+        pcaliases,
       };
       rmp_serde::encode::write_named(w, &isa)
     })?;
@@ -1038,8 +1046,9 @@ impl InstanceGuard<'_> {
   fn load_game(accounts: &AccountsGuard,
                games: &mut GamesGuard,
                name: InstanceName) -> Option<InstanceRef> {
-    let InstanceSaveAccesses::<String,ActualIPieces,IOccults> {
+    let InstanceSaveAccesses::<String,ActualIPieces,IOccults,PieceAliases> {
       tokens_players, mut ipieces, ioccults, mut aplayers, acl, links,
+      pcaliases,
     } = match Self::load_something(&name, "a-") {
       Ok(data) => data,
       Err(e) => if (||{
@@ -1103,6 +1112,7 @@ impl InstanceGuard<'_> {
       gs, iplayers, links,
       acl: acl.into(),
       ipieces: IPieces(ipieces),
+      pcaliases,
       ioccults,
       name: name.clone(),
       clients: default(),
index 523270ccaaa642e9e4b90fa2da3734655aac24c5..acaddafa26f36d261bfc8e040b4b8ec6e03ab56a 100644 (file)
@@ -13,6 +13,7 @@ pub use std::borrow::Borrow;
 pub use std::borrow::Cow;
 pub use std::cmp::{self, max, min, Ordering};
 pub use std::collections::VecDeque;
+pub use std::collections::{btree_map, BTreeMap};
 pub use std::collections::{btree_set, BTreeSet};
 pub use std::collections::{hash_map, HashMap, HashSet};
 pub use std::convert::{Infallible, TryFrom, TryInto};