chiark / gitweb /
wip library-add
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 27 Sep 2020 01:48:26 +0000 (02:48 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 27 Sep 2020 01:48:26 +0000 (02:48 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/otter.rs
src/shapelib.rs

index e532409a746f381f0ef95ce3f67551a4e19397cc..9de3b1174fd93a41eef40430c5cf0927b749dedd 100644 (file)
@@ -572,17 +572,23 @@ mod library_add {
 
   #[derive(Default,Debug)]
   struct Args {
+    adjust_markers: Option<bool>,
     name: String,
     lib: String,
     pat: String,
   }
 
+  impl Args {
+    fn adjust_markers(&self) -> bool { self.adjust_markers.unwrap_or(true) }
+  }
+
   fn subargs(sa: &mut Args) -> ArgumentParser {
     use argparse::*;
     let mut ap = ArgumentParser::new();
-/*      .add_option(&["--no-add-markers"],StoreOption,
-                  "reset the players and access too");
-*/
+    ap.refer(&mut sa.adjust_markers)
+      .add_option(&["--no-adjust-markers"],StoreConst(Some(false)),
+                  "do not adjust the number of insertion markers, just fail")
+      .add_option(&["--adjust-markers"],StoreConst(Some(true)),"");
     ap.refer(&mut sa.name).required()
       .add_argument("TABLE-NAME",Store,"table name");
     ap.refer(&mut sa.lib).required()
@@ -593,6 +599,8 @@ mod library_add {
   }
 
   fn call(_sc: &Subcommand, ma: MainOpts, args: Vec<String>) ->Result<(),AE> {
+    const MAGIC : &str = "mgmt-library-load-marker";
+
     let args = parse_args::<Args,_>(args, &subargs, None, None);
     let mut chan = ConnForGame {
       conn: connect(&ma)?,
@@ -600,9 +608,43 @@ mod library_add {
       how: MgmtGameUpdateMode::Online,
     };
     let markers = chan.get_pieces()?.into_iter().filter(
-      |p| p.itemname == "mgmt-library-load-marker"
+      |p| p.itemname == MAGIC
     ).collect::<Vec<_>>();
-    dbg!(&markers);
+
+    dbg!(&markers, &args);
+
+    #[derive(Debug)]
+    enum Situation {
+      Poor(Vec<Insn>),
+      Good(),
+    };
+    use Situation::*;
+
+    const WANTED : usize = 2;
+    let situation = if markers.len() < WANTED {
+      let to_add = WANTED - markers.len();
+      let spec = shapelib::ItemSpec {
+        lib: "wikimedia".to_string(), // todo: make an argument
+        item: MAGIC.to_string(),
+      };
+      let spec = PiecesSpec {
+        pos: None,
+        posd: None,
+        count: Some(to_add as u32),
+        face: None,
+        info: Box::new(spec),
+      };
+      Poor(vec![ Insn::AddPieces(spec) ])
+    } else if markers.len() > WANTED {
+      let insns = markers[WANTED..].iter()
+        .map(|p| Insn::DeletePiece(p.piece))
+        .collect();
+      Poor(insns)
+    } else {
+      Good()
+    };
+    dbg!(&situation);
+
     Ok(())
   }
 
index 220af477e3de66e0486fffba576486f2b524b615..911ada8caabac3b27ddd6e769fc4ba12b3705120 100644 (file)
@@ -114,9 +114,9 @@ type TV = toml::Value;
 type SE = SpecError;
 
 #[derive(Debug,Serialize,Deserialize)]
-struct ItemSpec {
-  lib: String,
-  item: String,
+pub struct ItemSpec {
+  pub lib: String,
+  pub item: String,
 }
 
 define_index_type!{ pub struct DescId = u8; }