use Delta; use DeltaReader; use DeltaReceiver; use ReceivedDelta; use Snap; use Storage; use format; use gamenet::msg::system; use packer::Unpacker; use receiver; use snap; use storage; use warn::Warn; use warn::wrap; #[derive(Clone, Debug, Eq, PartialEq)] pub enum Error { Receiver(receiver::Error), Snap(snap::Error), Storage(storage::Error), } #[derive(Clone, Debug, Eq, PartialEq)] pub enum Warning { Receiver(receiver::Warning), Snap(format::Warning), Storage(storage::Warning), } impl From for Error { fn from(err: receiver::Error) -> Error { Error::Receiver(err) } } impl From for Error { fn from(err: snap::Error) -> Error { Error::Snap(err) } } impl From for Error { fn from(err: storage::Error) -> Error { Error::Storage(err) } } impl From for Warning { fn from(w: receiver::Warning) -> Warning { Warning::Receiver(w) } } impl From for Warning { fn from(w: format::Warning) -> Warning { Warning::Snap(w) } } impl From for Warning { fn from(w: storage::Warning) -> Warning { Warning::Storage(w) } } #[derive(Clone, Default)] struct ManagerInner { temp_delta: Delta, reader: DeltaReader, storage: Storage, } #[derive(Clone, Default)] pub struct Manager { inner: ManagerInner, receiver: DeltaReceiver, } impl Manager { pub fn new() -> Manager { Default::default() } pub fn reset(&mut self) { self.inner.storage.reset(); self.receiver.reset(); } pub fn ack_tick(&self) -> Option { self.inner.storage.ack_tick() } pub fn snap_empty(&mut self, warn: &mut W, object_size: O, snap: system::SnapEmpty) -> Result, Error> where W: Warn, O: FnMut(u16) -> Option, { let res = self.receiver.snap_empty(wrap(warn), snap); self.inner.handle_msg(warn, object_size, res) } pub fn snap_single(&mut self, warn: &mut W, object_size: O, snap: system::SnapSingle) -> Result, Error> where W: Warn, O: FnMut(u16) -> Option, { let res = self.receiver.snap_single(wrap(warn), snap); self.inner.handle_msg(warn, object_size, res) } pub fn snap(&mut self, warn: &mut W, object_size: O, snap: system::Snap) -> Result, Error> where W: Warn, O: FnMut(u16) -> Option, { let res = self.receiver.snap(wrap(warn), snap); self.inner.handle_msg(warn, object_size, res) } } impl ManagerInner { fn handle_msg(&mut self, warn: &mut W, object_size: O, res: Result, receiver::Error>) -> Result, Error> where W: Warn, O: FnMut(u16) -> Option, { Ok(match res? { Some(delta) => Some(self.add_delta(warn, object_size, delta)?), None => None, }) } fn add_delta(&mut self, warn: &mut W, object_size: O, delta: ReceivedDelta) -> Result<&Snap, Error> where W: Warn, O: FnMut(u16) -> Option, { let crc = delta.data_and_crc.map(|d| d.1); if let Some((data, _)) = delta.data_and_crc { self.reader.read(wrap(warn), &mut self.temp_delta, object_size, &mut Unpacker::new(data))?; } else { self.temp_delta.clear(); } Ok(self.storage.add_delta(wrap(warn), crc, delta.delta_tick, delta.tick, &self.temp_delta)?) } }