JSONSerializeFailed(#[from] serde_json::error::Error),
#[error("SVG processing/generation error {0:?}")]
SVGProcessingFailed(#[from] SVGProcessingError),
+ #[error("IO error in server {0:?}")]
+ ServerIOError(#[from] io::Error),
}
pub use OnlineError::{NoClient,NoPlayer};
use crate::imports::*;
use lazy_static::lazy_static;
+const SAVE_DIRECTORY : &str = "save";
+
// ---------- newtypes and type aliases ----------
visible_slotmap_key!{ ClientId('C') }
#[derive(Debug)]
pub struct Instance {
+ pub name : String,
pub gs : GameState,
pub clients : DenseSlotMap<ClientId,Client>,
pub updates : SecondarySlotMap<PlayerId, PlayerUpdates>,
impl Instance {
#[throws(OE)]
- pub fn new(gs: GameState) -> Instance {
+ pub fn new(gs: GameState, instance_name: String) -> Instance {
Instance {
+ name : instance_name,
gs,
clients : Default::default(),
updates : Default::default(),
}
#[throws(OE)]
- fn save_game_now(&mut self) { eprintln!("xxx would save!"); }
+ fn save_game_now(&mut self) {
+ let savefile : String =
+ iter::once("g-")
+ .chain( utf8_percent_encode(&self.name,
+ &percent_encoding::NON_ALPHANUMERIC) )
+ .chain( iter::once(".tmp") )
+ .collect();
+ let mut f = BufWriter::new(fs::File::create(&savefile)?);
+ rmp_serde::encode::write_named(&mut f, &self.ig.gs);
+ eprintln!("xxx saved {} to {}!", self.name, &savefile);
+ }
+
#[throws(OE)]
fn save_access_now(&mut self) { eprintln!("xxx would save!"); }
}
#[throws(OE)]
pub fn xxx_global_setup() {
let gs = xxx_gamestate_init();
- let gi = Instance::new(gs)?;
+ let gi = Instance::new(gs, "dummy".to_string())?;
let amu = Arc::new(Mutex::new(gi));
let mut ig = Instance::lock(&amu)?;
for (token, nick) in XXX_PLAYERS_TOKENS {
use OnlineError::*;
let status = match self {
GameCorrupted | JSONSerializeFailed(_) | SVGProcessingFailed(_)
+ | ServerIOError(_)
=> Status::InternalServerError,
NoClient | NoPlayer => Status::NotFound,
InvalidZCoord => Status::BadRequest,
pub use std::io;
-pub use std::io::{BufReader,Read,Write};
+pub use std::io::{BufReader,Read,BufWriter,Write};
pub use std::fmt::Write as _;
pub use std::fmt::Formatter;
pub use std::fmt::{self,Display,Debug};
pub use std::error::Error;
pub use std::marker::PhantomData;
pub use std::ops::{Deref,DerefMut};
+pub use std::fs;
pub use thiserror::Error;
pub use anyhow::{Context,anyhow};
pub use rocket_contrib::helmet::*;
pub use rocket_contrib::templates::Template;
+pub use percent_encoding::utf8_percent_encode;
+pub use percent_encoding::NON_ALPHANUMERIC;
+
pub use rocket::{State,Rocket};
pub use rocket::http::{RawStr,ContentType};
pub use rocket::request::{FromParam,FromRequest,FromFormValue,LenientForm};