arc_malachitebft_sync/
effect.rs1use std::{marker::PhantomData, ops::RangeInclusive};
2
3use derive_where::derive_where;
4use thiserror::Error;
5
6use malachitebft_core_types::Context;
7use malachitebft_peer::PeerId;
8
9use crate::{InboundRequestId, OutboundRequestId, ValueRequest, ValueResponse};
10
11pub trait Resumable<Ctx: Context> {
35 type Value;
37
38 fn resume_with(self, value: Self::Value) -> Resume<Ctx>;
40}
41
42#[derive_where(Debug)]
43#[derive(Error)]
44pub enum Error<Ctx: Context> {
45 #[error("Unexpected resume: {0:?}, expected one of: {1}")]
48 UnexpectedResume(Resume<Ctx>, &'static str),
49}
50
51#[derive_where(Debug)]
52pub enum Resume<Ctx: Context> {
53 Continue(PhantomData<Ctx>),
54 ValueRequestId(Option<OutboundRequestId>),
55}
56
57impl<Ctx: Context> Default for Resume<Ctx> {
58 fn default() -> Self {
59 Self::Continue(PhantomData)
60 }
61}
62
63#[derive_where(Debug)]
64pub enum Effect<Ctx: Context> {
65 BroadcastStatus(Ctx::Height, resume::Continue),
67
68 SendValueRequest(PeerId, ValueRequest<Ctx>, resume::ValueRequestId),
70
71 SendValueResponse(InboundRequestId, ValueResponse<Ctx>, resume::Continue),
73
74 GetDecidedValues(
76 InboundRequestId,
77 RangeInclusive<Ctx::Height>,
78 resume::Continue,
79 ),
80
81 ProcessValueResponse(
83 PeerId,
84 OutboundRequestId,
85 ValueResponse<Ctx>,
86 resume::Continue,
87 ),
88}
89
90pub mod resume {
91
92 use super::*;
93
94 #[derive(Debug, Default)]
95 pub struct Continue;
96
97 impl<Ctx: Context> Resumable<Ctx> for Continue {
98 type Value = ();
99
100 fn resume_with(self, _: ()) -> Resume<Ctx> {
101 Resume::default()
102 }
103 }
104
105 #[derive(Debug, Default)]
106 pub struct ValueRequestId;
107
108 impl<Ctx: Context> Resumable<Ctx> for ValueRequestId {
109 type Value = Option<OutboundRequestId>;
110
111 fn resume_with(self, value: Self::Value) -> Resume<Ctx> {
112 Resume::ValueRequestId(value)
113 }
114 }
115}