Skip to main content

asteroid_mq/protocol/node/raft/state_machine/topic/
config.rs

1use std::num::NonZeroU32;
2
3use serde::{Deserialize, Serialize};
4
5use crate::prelude::TopicCode;
6
7#[derive(Debug, Clone, Default)]
8
9pub struct TopicDurabilityConfig {}
10#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
11pub enum TopicOverflowPolicy {
12    #[default]
13    RejectNew = 0,
14    DropOld = 1,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18
19pub struct TopicOverflowConfig {
20    pub policy: TopicOverflowPolicy,
21    pub size: NonZeroU32,
22}
23
24impl TopicOverflowConfig {
25    #[inline(always)]
26    pub fn size(&self) -> usize {
27        self.size.get() as usize
28    }
29    pub fn new_reject_new(size: u32) -> Self {
30        Self {
31            policy: TopicOverflowPolicy::RejectNew,
32            size: NonZeroU32::new(size).unwrap_or(NonZeroU32::MAX),
33        }
34    }
35    pub fn new_drop_old(size: u32) -> Self {
36        Self {
37            policy: TopicOverflowPolicy::DropOld,
38            size: NonZeroU32::new(size).unwrap_or(NonZeroU32::MAX),
39        }
40    }
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct TopicConfig {
45    pub code: TopicCode,
46    pub blocking: bool,
47    pub overflow_config: Option<TopicOverflowConfig>,
48    pub max_payload_size: u32,
49}
50
51const DEFAULT_MAX_PAYLOAD_SIZE: u32 = 1024 * 1024;
52
53impl From<TopicCode> for TopicConfig {
54    fn from(code: TopicCode) -> Self {
55        Self {
56            code,
57            blocking: false,
58            overflow_config: None,
59            max_payload_size: DEFAULT_MAX_PAYLOAD_SIZE,
60        }
61    }
62}