1use std::sync::Arc;
4
5#[derive(Debug, PartialEq, Eq, Hash, Clone)]
7pub enum Message<T> {
8 Prepare(ProposalData),
9 Promise(PromiseData<T>),
10 Accept(AcceptData<T>),
11 Accepted(AcceptedData<T>),
12 Nack,
13}
14
15#[derive(Debug, PartialEq, Eq, Hash, Clone)]
17pub struct ProposalData {
18 pub id: u64,
19}
20
21#[derive(Debug, PartialEq, Eq, Hash, Clone)]
23pub struct PromiseData<T> {
24 pub id: u64,
25 pub value: Option<Arc<T>>,
26 pub from: u64,
27}
28
29#[derive(Debug, PartialEq, Eq, Hash, Clone)]
31pub struct AcceptData<T> {
32 pub id: u64,
33 pub value: Arc<T>,
34}
35
36#[derive(Debug, PartialEq, Eq, Hash, Clone)]
38pub struct AcceptedData<T> {
39 pub id: u64,
40 pub value: Arc<T>,
41 pub from: u64,
42}
43
44pub trait Messenger<T> {
45 fn send_prepare(&mut self, msg: Message<T>);
46
47 fn send_promise(&mut self, msg: Message<T>);
48
49 fn send_accept(&mut self, msg: Message<T>);
50
51 fn send_accepted(&mut self, msg: Message<T>);
52
53 fn on_resolution(&mut self, proposal_n: u64, value: Arc<T>);
54}