use crate::communication::messages::{Package, UpdateClusterVec};
use crate::communication::service::CommunicationService;
use core::fmt::Debug;
use crate::nodes::SystemNodeId;
use crate::rules::measurements::{Measurement, SystemState};
use crate::rules::strategy::Rule;
pub type CoordinationPackage<CoordMessage> = Package<SystemNodeId, CoordMessage>;
pub trait Stopwatch {
fn from_millis(millis: u64) -> Self;
fn as_secs(&self) -> u64;
fn restart(&mut self);
fn is_timeout(&self) -> bool;
fn current_time_as_secs(&mut self) -> u64;
fn update(&mut self) {}
}
pub trait Timer {
fn from_millis(millis: u64) -> Self;
fn as_secs(&self) -> u64;
fn wait(&self);
}
pub trait CoordinationService<Clock: Stopwatch, Message: Clone + Debug, Members, Metadata> {
fn new(id: SystemNodeId, metadata: Metadata) -> Self;
fn leader(&self) -> Option<SystemNodeId>;
fn get_state(&self) -> SystemState;
fn get_current_rule(&self) -> Option<Rule>;
fn update_rule(
&mut self,
communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
new_rule: Rule,
);
fn update_members(
&mut self,
communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
new_config: UpdateClusterVec,
);
fn update_state(
&mut self,
communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
measurement: Measurement,
);
fn process(
&mut self,
communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
package: Option<CoordinationPackage<Message>>,
members: Members,
);
}