From 625ab5bb37cbe35fd9662a33bc92f73520e59c81 Mon Sep 17 00:00:00 2001 From: troido Date: Mon, 17 Feb 2020 01:14:03 +0100 Subject: added trait for interacting with persistent storage; tried to make Results easier --- src/persistence.rs | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/persistence.rs (limited to 'src/persistence.rs') diff --git a/src/persistence.rs b/src/persistence.rs new file mode 100644 index 0000000..fc04378 --- /dev/null +++ b/src/persistence.rs @@ -0,0 +1,77 @@ + +use std::path::PathBuf; +use std::fs; +use serde_json; +use serde_json::Value; +use crate::{ + PlayerId, + savestate::SaveState, + playerstate::PlayerState, + util::Result, + aerr +}; + +pub trait PersistentStorage { + + fn load_room(&self, name: String) -> Result; + + fn load_player(&self, id: PlayerId) -> Result; + + fn save_room(&self, name: String, state: SaveState) -> Result<()>; + + fn save_player(&self, id: PlayerId, sate: PlayerState) -> Result<()>; + +} + + +pub struct FileStorage { + directory: PathBuf +} + +impl PersistentStorage for FileStorage { + + fn load_room(&self, name: String) -> Result { + let mut path = self.directory.clone(); + path.push("rooms"); + let fname = name + ".save.json"; + path.push(fname); + let text = fs::read_to_string(path)?; + let json: Value = serde_json::from_str(&text)?; + SaveState::from_json(&json).ok_or(aerr!("not a valid save state")) + } + + fn load_player(&self, id: PlayerId) -> Result { + let mut path = self.directory.clone(); + path.push("players"); + let fname = id.name + ".save.json"; + path.push(fname); + let text = fs::read_to_string(path)?; + let json: Value = serde_json::from_str(&text)?; + PlayerState::from_json(&json).ok_or(aerr!("not a valid save state")) + } + + fn save_room(&self, name: String, state: SaveState) -> Result<()> { + let mut path = self.directory.clone(); + path.push("rooms"); + fs::create_dir_all(&path)?; + let fname = name + ".save.json"; + path.push(fname); + let text = state.to_json().to_string(); + // todo: write to a temp file first + fs::write(path, text)?; + Ok(()) + } + + fn save_player(&self, id: PlayerId, state: PlayerState) -> Result<()> { + let mut path = self.directory.clone(); + path.push("players"); + fs::create_dir_all(&path)?; + let fname = id.name + ".save.json"; + path.push(fname); + let text = state.to_json().to_string(); + // todo: write to a temp file first + fs::write(path, text)?; + Ok(()) + } +} + -- cgit