1use crate::communication::messages::{Package, UpdateClusterVec};
2use crate::communication::service::CommunicationService;
3use core::fmt::Debug;
4
5use crate::nodes::SystemNodeId;
6use crate::rules::measurements::{Measurement, SystemState};
7use crate::rules::strategy::Rule;
8
9pub type CoordinationPackage<CoordMessage> = Package<SystemNodeId, CoordMessage>;
10
11pub trait Stopwatch {
14 fn from_millis(millis: u64) -> Self;
16 fn as_secs(&self) -> u64;
18 fn restart(&mut self);
20 fn is_timeout(&self) -> bool;
22 fn current_time_as_secs(&mut self) -> u64;
24 fn update(&mut self) {}
27}
28
29pub trait Timer {
31 fn from_millis(millis: u64) -> Self;
33 fn as_secs(&self) -> u64;
35 fn wait(&self);
37}
38
39pub trait CoordinationService<Clock: Stopwatch, Message: Clone + Debug, Members, Metadata> {
41 fn new(id: SystemNodeId, metadata: Metadata) -> Self;
42
43 fn leader(&self) -> Option<SystemNodeId>;
45
46 fn get_state(&self) -> SystemState;
48
49 fn get_current_rule(&self) -> Option<Rule>;
51
52 fn update_rule(
54 &mut self,
55 communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
56 new_rule: Rule,
57 );
58
59 fn update_members(
61 &mut self,
62 communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
63 new_config: UpdateClusterVec,
64 );
65
66 fn update_state(
68 &mut self,
69 communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
70 measurement: Measurement,
71 );
72
73 fn process(
75 &mut self,
76 communication_service: &mut dyn CommunicationService<Package<SystemNodeId, Message>>,
77 package: Option<CoordinationPackage<Message>>,
78 members: Members,
79 );
80}