chiark / gitweb /
Make library list a per-table thing at managemnet API
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 May 2021 18:06:15 +0000 (19:06 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 May 2021 18:06:27 +0000 (19:06 +0100)
The LibraryListByGlob command now takes a game name, and
acquires an &InstanceGuard.  Currently, it ignores it.

The list_items method is now on MgmtChannelForGame.

otter(1) LibGlobArgs now has the table name.  The library-list
subcommand accesses the game (and has different arguments)

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
apitest/at-otter.rs
daemon/cmdlistener.rs
src/bin/otter.rs
src/commands.rs
src/mgmtchannel.rs

index 1b5cf178caa619bbb8f01cc1bb1440ac3c9dcc9d..6da3413a13865f5b9cff779752e5de95bf6b0d17 100644 (file)
@@ -497,7 +497,7 @@ impl Ctx {
     prepare_game(&self.su().ds, &self.prctx, TABLE)?;
 
     let command = self.su().ds.ss(
-      "library-list wikimedia chess-yellow-?"
+      "library-list @table@ wikimedia chess-yellow-?"
     )?;
     let output: String = self.otter(&command)?.into();
     assert!( Regex::new("(?m)^chess-yellow-K  *the yellow king$")?
index 92d885816d458ce52af60bb81dd1b0ba68c18521..a33a15eb4709b5dfe5b9b0e0c8fd09670825094d 100644 (file)
@@ -349,12 +349,19 @@ fn execute_and_respond<R,W>(cs: &mut CommandStreamData, cmd: MgmtCommand,
       Fine
     }
 
-    MC::LibraryListByGlob { glob: spec } => {
-      let libs = shapelib::lib_name_lookup(&spec.lib)?;
-      let mut results: Vec<shapelib::ItemEnquiryData> = default();
-      for lib in &*libs {
-        results.extend(lib.list_glob(&spec.item)?);
-      }
+    MC::LibraryListByGlob { game, glob: spec } => {
+      let (ag, gref) = start_access_game(&game)?;
+      let (results, _auth) =
+        access_bundles(
+          cs,&ag,&gref, &[TP::UploadBundles],
+          &mut |mut _ig, _| {
+            let libs = shapelib::lib_name_lookup(&spec.lib)?;
+            let mut results: Vec<shapelib::ItemEnquiryData> = default();
+            for lib in &*libs {
+              results.extend(lib.list_glob(&spec.item)?);
+            }
+            Ok(results)
+          })?;
       MR::LibraryItems(results)
     }
 
index 9eba6f2c8b489825104b71becb21a0df7415f58f..dc531d0f760ec629411dd854b0739a126fdc57c9 100644 (file)
@@ -971,10 +971,12 @@ mod delete_game {
 
 #[derive(Debug)]
 struct LibGlobArgs {
+  table_name: String,
   pat: shapelib::ItemSpec,
 }
 
 impl Default for LibGlobArgs { fn default() -> Self { Self {
+  table_name: default(),
   pat: shapelib::ItemSpec { lib: default(), item: default() },
 } } }
 
@@ -984,6 +986,8 @@ impl LibGlobArgs {
     ap: &'_ mut ArgumentParser<'ap>
   ) {
     use argparse::*;
+    ap.refer(&mut self.table_name).required()
+      .add_argument("TABLE-NAME",Store,"table name");
     // xxx allow lack of library name to list library names
     ap.refer(&mut self.pat.lib).required()
       .add_argument("LIB-NAME",Store,"library name");
@@ -1007,7 +1011,7 @@ mod library_list {
 
   fn call(_sc: &Subcommand, ma: MainOpts, args: Vec<String>) ->Result<(),AE> {
     let args = parse_args::<Args,_>(args, &subargs, &ok_id, None);
-    let mut chan = connect(&ma)?;
+    let mut chan = access_game(&ma, &args.table_name)?;
 
     let items = chan.list_items(&args.pat)?;
     for it in &items {
@@ -1031,7 +1035,6 @@ mod library_add {
 
   #[derive(Default,Debug)]
   struct Args {
-    table_name: String,
     tlg: LibGlobArgs,
     adjust_markers: Option<bool>,
     incremental: bool,
@@ -1044,8 +1047,7 @@ mod library_add {
   fn subargs(sa: &mut Args) -> ArgumentParser {
     use argparse::*;
     let mut ap = ArgumentParser::new();
-    ap.refer(&mut sa.table_name).required()
-      .add_argument("TABLE-NAME",Store,"table name");
+    sa.tlg.add_arguments(&mut ap);
     ap.refer(&mut sa.adjust_markers)
       .add_option(&["--no-adjust-markers"],StoreConst(Some(false)),
                   "do not adjust the number of insertion markers, just fail")
@@ -1055,7 +1057,6 @@ mod library_add {
                   "do not place pieces already on the board; \
                    if they don't all fit, place as many as possible")
       .add_option(&["--no-incremental"],StoreConst(false),"");
-    sa.tlg.add_arguments(&mut ap);
     ap
   }
 
@@ -1063,7 +1064,7 @@ mod library_add {
     const MAGIC: &str = "mgmt-library-load-marker";
 
     let args = parse_args::<Args,_>(args, &subargs, &ok_id, None);
-    let mut chan = access_game(&ma, &args.table_name)?;
+    let mut chan = access_game(&ma, &args.tlg.table_name)?;
     let (pieces, _pcaliases) = chan.list_pieces()?;
     let markers = pieces.iter().filter(|p| p.itemname.as_str() == MAGIC)
       .collect::<Vec<_>>();
index 786402c698063aa9838759bb8f3c48ecc659bf26..e2471ae3fe27b7164baf5172f63833bd67e3ff89 100644 (file)
@@ -55,6 +55,7 @@ pub enum MgmtCommand {
   },
 
   LibraryListByGlob {
+    game: InstanceName,
     glob: shapelib::ItemSpec,
   },
 
index 54f5561959b4d472e2e5a75a940f217618e794bc..ef41428de0a4770e8c69e277d90eff4c2ac8674f 100644 (file)
@@ -122,20 +122,6 @@ impl MgmtChannel {
     self.cmd_withbulk(cmd, &mut io::empty(), &mut io::sink(), &mut |_|Ok(()))?
   }
 
-  #[throws(AE)]
-  pub fn list_items(&mut self, pat: &shapelib::ItemSpec)
-                -> Vec<shapelib::ItemEnquiryData> {
-    // xxx allow globbing of library names
-    let cmd = MgmtCommand::LibraryListByGlob { glob: pat.clone() };
-    let mut items = match self.cmd(&cmd)? {
-      MgmtResponse::LibraryItems(items) => items,
-      wat => Err(anyhow!("unexpected LibraryListByGlob response: {:?}",
-                         &wat))?,
-    };
-    items.sort();
-    items
-  }
-
   pub fn for_game(self, game: InstanceName, how: MgmtGameUpdateMode)
                   -> MgmtChannelForGame {
     MgmtChannelForGame {
@@ -224,6 +210,24 @@ impl MgmtChannelForGame {
       wat => Err(anyhow!("ListPieces => {:?}", &wat))?,
     }
   }
+
+  #[throws(AE)]
+  pub fn list_items(&mut self, pat: &shapelib::ItemSpec)
+                -> Vec<shapelib::ItemEnquiryData> {
+    // xxx allow globbing of library names
+    let cmd = MgmtCommand::LibraryListByGlob {
+      game: self.game.clone(),
+      glob: pat.clone(),
+    };
+    let mut items = match self.cmd(&cmd)? {
+      MgmtResponse::LibraryItems(items) => items,
+      wat => Err(anyhow!("unexpected LibraryListByGlob response: {:?}",
+                         &wat))?,
+    };
+    items.sort();
+    items
+  }
+
 /*
   fn get_info(&mut self) -> Result<
       (MgmtGameResponseGameInfo, HashMap<String,PlayerId>