use gled_model::collection::Collections;
use crate::{assets::collections_from, message::ServerMessage, state::EngineState};
#[derive(Debug, Clone, Default)]
pub struct StateReplica {
pub state: EngineState,
pub applied_sequence: u64,
pub complete: bool,
pub assets: Collections,
pub(crate) assets_complete: bool,
}
impl StateReplica {
pub fn apply(&mut self, message: &ServerMessage) -> bool {
match message {
ServerMessage::State {
state,
applied_sequence,
} => {
self.state = EngineState::clone(state);
self.applied_sequence = *applied_sequence;
self.complete = true;
true
}
ServerMessage::Update {
state,
project,
applied_sequence,
} if self.complete => {
let mut replica_project = self.state.project.take();
project.clone().apply_to(&mut replica_project);
self.state = EngineState {
project: replica_project,
..EngineState::clone(state)
};
self.applied_sequence = *applied_sequence;
true
}
ServerMessage::Assets(assets) => {
self.assets = collections_from(assets.clone());
self.assets_complete = true;
true
}
ServerMessage::AssetsChanged(changes) if self.assets_complete => {
changes.clone().apply_to(&mut self.assets);
true
}
ServerMessage::Timing { beat, render } if self.complete => {
self.state.beat = *beat;
self.state.render = *render;
true
}
_ => false,
}
}
}