chiark / gitweb /
wip decode
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 19 Jul 2020 00:55:19 +0000 (01:55 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 19 Jul 2020 00:55:19 +0000 (01:55 +0100)
src/error.rs
src/global.rs
src/http.rs
src/imports.rs

index aed9e2960f585287d189b5dc2b9042c0ce308c14..3d1ca07310bb6c714b7859f9b7d7e4aebb94cbe8 100644 (file)
@@ -30,6 +30,8 @@ pub enum OnlineError {
   ServerIOError(#[from] io::Error),
   #[error("Server MessagePack encoding error {0:?}")]
   ServerMessagePackEncodeFail(#[from] rmp_serde::encode::Error),
+  #[error("Server MessagePack decoding error (game load failed) {0:?}")]
+  ServerMessagePackDecodeFail(#[from] rmp_serde::decode::Error),
 }
 
 pub use OnlineError::{NoClient,NoPlayer};
index 2d34cbfda7a566adb50ce0a680ced4e7150c6523..22988a392530a8f66f355243848bdd7fe6cb936e 100644 (file)
@@ -50,9 +50,8 @@ pub struct TokenRegistry<Id: AccessId> {
 }
 
 #[derive(Debug,Serialize,Deserialize)]
-struct InstanceSaveAccesses<'r> {
-  #[serde(borrow)]
-  tokens_players : Vec<(&'r str, PlayerId)>,
+struct InstanceSaveAccesses<RawTokenStr> {
+  tokens_players : Vec<(RawTokenStr, PlayerId)>,
 }
 
 // ---------- API ----------
@@ -162,9 +161,9 @@ impl InstanceGuard<'_> {
     for t in tokens.tr.drain() { global.remove(&t); }
   }
 
-  fn savefile(&self, prefix: &str, suffix: &str) -> String {
+  fn savefile(name: &str, prefix: &str, suffix: &str) -> String {
     iter::once(prefix)
-      .chain( utf8_percent_encode(&self.name,
+      .chain( utf8_percent_encode(name,
                                   &percent_encoding::NON_ALPHANUMERIC) )
       .chain( iter::once(suffix) )
       .collect()
@@ -175,14 +174,14 @@ impl InstanceGuard<'_> {
     w: fn(s: &Self, w: &mut BufWriter<fs::File>)
           -> Result<(),rmp_serde::encode::Error>
   ) {
-    let tmp = self.savefile(prefix,".tmp");
+    let tmp = Self::savefile(&self.name, prefix,".tmp");
     let mut f = BufWriter::new(fs::File::create(&tmp)?);
     w(self, &mut f)?;
     f.flush()?;
     drop( f.into_inner().map_err(|e| { let e : io::Error = e.into(); e })? );
-    let out = self.savefile(prefix,"");
+    let out = Self::savefile(&self.name, prefix,"");
     fs::rename(&tmp, &out)?;
-    eprintln!("xxx saved {} to {}!", self.name, &out);
+    eprintln!("saved to {}", &out);
   }
 
   #[throws(OE)]
@@ -193,7 +192,33 @@ impl InstanceGuard<'_> {
   }
 
   #[throws(OE)]
-  fn save_access_now(&mut self) { eprintln!("xxx would save!"); }
+  fn save_access_now(&mut self) {
+    self.save_something("a-", |s,w| {
+      let global_players = GLOBAL.players.read().unwrap();
+      let tokens_players : Vec<(&str, PlayerId)> =
+        s.ig.tokens_players.tr
+        .iter()
+        .map(|token|
+             global_players.get(token)
+             .map(|player| (token.0.as_str(), player.ident)))
+        .flatten()
+        .collect();
+      let isa = InstanceSaveAccesses { tokens_players };
+      rmp_serde::encode::write_named(w, &isa)
+    })?;
+  }
+
+  #[throws(OE)]
+  fn load_something<T:DeserializeOwned>(name: &str, prefix: &str) -> T {
+    let inp = Self::savefile(name, prefix, "");
+    let mut f = BufReader::new(fs::File::open(&inp)?);
+    rmp_serde::decode::from_read(&mut f)?
+  }
+/*
+  pub fn load(instance_name: String) -> Arc<Mutex<Instance>> {
+    let gs = Self::savefile(&instance_name,"g-");
+    
+  }*/
 }
 
 // ---------- Lookup and token API ----------
index d03ef869bece1ed42727f399944d63a98dadf5cf..9a4efc5e7f91b48c448f8a42fa8c7dcd470b4449 100644 (file)
@@ -15,7 +15,9 @@ impl<'r> Responder<'r> for OnlineError {
     use OnlineError::*;
     let status = match self {
       GameCorrupted | JSONSerializeFailed(_) | SVGProcessingFailed(_)
-        | ServerIOError(_) | ServerMessagePackEncodeFail(_)
+        | ServerIOError(_)
+        | ServerMessagePackEncodeFail(_)
+        | ServerMessagePackDecodeFail(_)
         => Status::InternalServerError,
       NoClient | NoPlayer => Status::NotFound,
       InvalidZCoord => Status::BadRequest,
index 8948593d1f5b7164d23d35534e3245eccd37c363..a249c9c4e7d9fbbffeae3fcce82aab3435ad8835 100644 (file)
@@ -26,7 +26,7 @@ pub use thiserror::Error;
 pub use anyhow::{Context,anyhow};
 pub use fehler::{throws,throw};
 
-pub use serde::{Serialize,Deserialize};
+pub use serde::{Serialize,Deserialize,de::DeserializeOwned};
 pub use serde::{Serializer,Deserializer};
 
 pub use rocket_contrib::helmet::*;