asteroid_mq/protocol/node/raft/state_machine/topic/
config.rs1use 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}