chiark / gitweb /
wip links - does not compile
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Jan 2021 02:28:50 +0000 (02:28 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Jan 2021 10:47:27 +0000 (10:47 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/otter.rs
src/commands.rs
src/spec.rs

index 814c05ba81405ba09eaa6ec7bda3b0efaef1f851..79a6dcccae90acf264381ba7617c8662dab696cf 100644 (file)
@@ -837,10 +837,10 @@ mod set_link {
 
   use super::*;
 
-  #[derive(Default,Debug)]
+  #[derive(Debug,Default)]
   struct Args {
     table_name: String,
-    kind: LinkKind,
+    kind: Option<LinkKind>,
     url: Option<String>,
   }
 
@@ -849,19 +849,46 @@ mod set_link {
     let mut ap = ArgumentParser::new();
     ap.refer(&mut sa.table_name).required()
       .add_argument("TABLE-NAME",Store,"table name");
-    ap.refer(&mut sa.kind).required()
-      .add_argument("LINK-KIND",Store,"link kind");
+    ap.refer(&mut sa.kind)
+      .add_argument("LINK-KIND",StoreOption,"link kind");
     ap.refer(&mut sa.url)
-      .add_argument("URL",Store,"url (or empty for none)");
+      .add_argument("URL",StoreOption,"url (or empty for none)");
     ap
   }
 
-  fn call(_sc: &Subcommand, ma: MainOpts, args: Vec<String>) ->Result<(),AE> {
+  #[throws(AE)]
+  fn call(_sc: &Subcommand, ma: MainOpts, args: Vec<String>) {
     let args = parse_args::<Args,_>(args, &subargs, &ok_id, None);
     let mut chan = access_game(&ma, &args.table_name)?;
 
-    let mut insns = vec![];
-    
+    match args.url {
+      None => {
+        let MgmtGameResponseGameInfo { links, .. } = chan.info()?;
+        for (tk, v) in links {
+          // xxx check syntax
+          match args.kind {
+            None => {
+              println!("{:<10} {}", tk, &v);
+            }
+            Some(wk) => {
+              if wk == tk {
+                println!("{}", &v);
+              }
+            }
+          }
+        }
+      },
+
+      Some(url) => {
+        chan.alter_game(vec![
+          if url == "" {
+            MGI::SetLink { kind: args.kind, url }
+          } else {
+            MGI::RemoveLink { kind: args.kind }
+          }
+        ])?;
+      },
+    }
   }
 
   inventory::submit!{Subcommand(
index 3570ce55c23a1f5c8570fad3029b1a13fbc29844..7408d3eb40eb1b1a2916574bef03c1896720de05 100644 (file)
@@ -87,7 +87,7 @@ pub enum MgmtGameInstruction {
   LeaveGame(PlayerId),
 
   SetLinks(HashMap<LinkKind,String>),
-  RemoveLink { kind: LinkKind, url: String },
+  RemoveLink { kind: LinkKind },
   SetLink { kind: LinkKind, url: String },
 
   ClearLog,
@@ -126,7 +126,7 @@ pub struct AccessTokenReport { pub lines: Vec<String> }
 pub struct MgmtGameResponseGameInfo {
   pub table_size: Pos,
   pub players: SecondarySlotMap<PlayerId, MgmtPlayerInfo>,
-  pub links: Vec<(LinkKind, String>),
+  pub links: Vec<(LinkKind, String)>,
 }
 
 #[derive(Debug,Clone,Serialize,Deserialize)]
index 6baab355a20542ebeffd6e1e053594e3207ca28f..4e4b3b252a64069d45bf42b99c06390b452cd354 100644 (file)
@@ -14,6 +14,7 @@ use fehler::throws;
 use index_vec::{define_index_type, IndexVec};
 use num_derive::{FromPrimitive, ToPrimitive};
 use serde::{Deserialize, Serialize};
+use strum::{EnumString, Display};
 use thiserror::Error;
 
 use crate::accounts::AccountName;
@@ -114,7 +115,8 @@ pub enum TablePermission {
 }
 
 #[derive(Copy,Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]
-#[derive(Enum,Serialize,Deserialize)]
+#[derive(Enum,EnumString,Display)]
+#[derive(Serialize,Deserialize)]
 pub enum LinkKind {
   Voice,
   Info,