danube_core/
dispatch_strategy.rsuse crate::proto::{ReliableOptions as ProtoReliableOptions, TopicDispatchStrategy};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConfigDispatchStrategy {
NonReliable,
Reliable(ReliableOptions),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReliableOptions {
pub segment_size: usize,
pub retention_policy: RetentionPolicy,
pub retention_period: u64,
}
impl ReliableOptions {
pub fn new(
segment_size: usize,
retention_policy: RetentionPolicy,
retention_period: u64,
) -> Self {
ReliableOptions {
segment_size,
retention_policy,
retention_period,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RetentionPolicy {
RetainUntilAck,
RetainUntilExpire,
}
impl Default for ConfigDispatchStrategy {
fn default() -> Self {
ConfigDispatchStrategy::NonReliable
}
}
impl From<TopicDispatchStrategy> for ConfigDispatchStrategy {
fn from(strategy: TopicDispatchStrategy) -> Self {
match strategy.strategy {
0 => ConfigDispatchStrategy::NonReliable,
1 => {
if let Some(reliable_opts) = strategy.reliable_options {
let retention_policy = match reliable_opts.retention_policy {
0 => RetentionPolicy::RetainUntilAck,
1 => RetentionPolicy::RetainUntilExpire,
_ => RetentionPolicy::RetainUntilAck,
};
ConfigDispatchStrategy::Reliable(ReliableOptions {
segment_size: reliable_opts.segment_size as usize,
retention_policy,
retention_period: reliable_opts.retention_period,
})
} else {
ConfigDispatchStrategy::NonReliable
}
}
_ => ConfigDispatchStrategy::NonReliable,
}
}
}
impl From<ConfigDispatchStrategy> for TopicDispatchStrategy {
fn from(config: ConfigDispatchStrategy) -> Self {
match config {
ConfigDispatchStrategy::NonReliable => TopicDispatchStrategy {
strategy: 0,
reliable_options: None,
},
ConfigDispatchStrategy::Reliable(opts) => {
let retention_policy = match opts.retention_policy {
RetentionPolicy::RetainUntilAck => 0,
RetentionPolicy::RetainUntilExpire => 1,
};
TopicDispatchStrategy {
strategy: 1,
reliable_options: Some(ProtoReliableOptions {
segment_size: opts.segment_size as u64,
retention_policy,
retention_period: opts.retention_period,
}),
}
}
}
}
}