hopr_transport/protocol/pipeline/
config.rs1use validator::{Validate, ValidationError, ValidationErrors};
4
5fn default_ack_buffer_interval() -> std::time::Duration {
6 std::time::Duration::from_millis(200)
7}
8
9fn default_ack_grouping_capacity() -> usize {
10 5
11}
12
13fn default_ticket_ack_buffer_size() -> usize {
14 50_000
15}
16
17fn default_ack_out_buffer_size() -> usize {
18 50_000
19}
20
21#[derive(Debug, Copy, Clone, smart_default::SmartDefault, Eq, PartialEq)]
23#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
24pub struct AcknowledgementPipelineConfig {
25 #[default(default_ack_buffer_interval())]
29 #[cfg_attr(
30 feature = "serde",
31 serde(default = "default_ack_buffer_interval", with = "humantime_serde")
32 )]
33 pub ack_buffer_interval: std::time::Duration,
34 #[default(default_ack_grouping_capacity())]
41 #[cfg_attr(feature = "serde", serde(default = "default_ack_grouping_capacity"))]
42 pub ack_grouping_capacity: usize,
43 #[default(default_ticket_ack_buffer_size())]
52 #[cfg_attr(feature = "serde", serde(default = "default_ticket_ack_buffer_size"))]
53 pub ticket_ack_buffer_size: usize,
54 #[default(default_ack_out_buffer_size())]
60 #[cfg_attr(feature = "serde", serde(default = "default_ack_out_buffer_size"))]
61 pub ack_out_buffer_size: usize,
62 pub ack_input_concurrency: Option<usize>,
66 pub ack_output_concurrency: Option<usize>,
70}
71
72impl Validate for AcknowledgementPipelineConfig {
74 fn validate(&self) -> Result<(), ValidationErrors> {
75 let mut errors = ValidationErrors::new();
76 if self.ack_grouping_capacity == 0 {
77 errors.add("ack_grouping_capacity", ValidationError::new("must be greater than 0"));
78 }
79 if self.ack_buffer_interval < std::time::Duration::from_millis(10) {
80 errors.add("ack_buffer_interval", ValidationError::new("must be at least 10 ms"));
81 }
82 if self.ticket_ack_buffer_size == 0 {
83 errors.add("ticket_ack_buffer_size", ValidationError::new("must be greater than 0"));
84 }
85 if self.ack_out_buffer_size == 0 {
86 errors.add("ack_out_buffer_size", ValidationError::new("must be greater than 0"));
87 }
88 if errors.is_empty() { Ok(()) } else { Err(errors) }
89 }
90}
91
92#[derive(Clone, Copy, Debug, Default, PartialEq, Validate)]
94#[cfg_attr(
95 feature = "serde",
96 derive(serde::Serialize, serde::Deserialize),
97 serde(deny_unknown_fields)
98)]
99pub struct PacketPipelineConfig {
100 pub output_concurrency: Option<usize>,
104 pub input_concurrency: Option<usize>,
108 #[validate(nested)]
110 pub ack_config: AcknowledgementPipelineConfig,
111}