diff options
| author | troido <troido@protonmail.com> | 2020-04-08 18:03:44 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-08 18:03:44 +0200 |
| commit | 15da8ce3af4e943939d6976ccfe5c46785638c7e (patch) | |
| tree | 96d63166d3a0914cf84b635417049310b6741bfa /src/world.rs | |
| parent | 950e15f7f7bbf354399c0d710ff8fb195a941e92 (diff) | |
don't ignore loading errors anymore
Diffstat (limited to 'src/world.rs')
| -rw-r--r-- | src/world.rs | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/world.rs b/src/world.rs index d7b5555..9de51d7 100644 --- a/src/world.rs +++ b/src/world.rs @@ -9,7 +9,7 @@ use crate::{ room::Room, room, worldloader::WorldLoader, - persistence::PersistentStorage, + persistence::{PersistentStorage, LoaderError}, playerstate::{PlayerState, RoomPos}, Encyclopedia, controls::Control, @@ -36,9 +36,18 @@ pub struct World<'a, 'b> { impl <'a, 'b>World<'a, 'b> { pub fn new(encyclopedia: Encyclopedia, template_loader: WorldLoader, persistence: Box<dyn PersistentStorage>, default_room: RoomId) -> Self { + let time = match persistence.load_world_meta() { + Ok(time) => {time} + Err(LoaderError::MissingResource(_)) => { + Timestamp(1000000) + } + Err(LoaderError::InvalidResource(err)) => { + panic!("Invalid world meta: {:?}", err) + } + }; World { template_loader, - time: persistence.load_world_meta().unwrap_or(Timestamp(1000000)), + time, persistence, default_room, encyclopedia: encyclopedia, @@ -69,8 +78,12 @@ impl <'a, 'b>World<'a, 'b> { room.load_from_template(&template)?; room }; - if let Ok(state) = self.persistence.load_room(id.clone()){ - room.load_saved(&state); + match self.persistence.load_room(id.clone()){ + Ok(state) => { + room.load_saved(&state); + } + Err(LoaderError::MissingResource(_)) => {} + Err(LoaderError::InvalidResource(err)) => {return Err(err);} } let last_time = self.time - 1; if room.get_time() < last_time { @@ -91,11 +104,15 @@ impl <'a, 'b>World<'a, 'b> { } pub fn add_player(&mut self, playerid: &PlayerId) -> Result<()> { - let mut state = self.persistence - .load_player(playerid.clone()) - .unwrap_or_else(|_err| // todo: what if player exists but can't be loaded for another reason? + let mut state = match self.persistence.load_player(playerid.clone()) { + Ok(state) => {state} + Err(LoaderError::MissingResource(_)) => { PlayerState::new(playerid.clone()) - ); + } + Err(LoaderError::InvalidResource(err)) => { + return Err(err) + } + }; state.id = playerid.clone(); if state.room == Some(purgatory::purgatory_id()){ state.respawn(); |
