use super::{MAX_NAME_LENGTH, MAX_PARTITIONS_COUNT};
use crate::CompressionAlgorithm;
use crate::Identifier;
use crate::Validatable;
use crate::error::IggyError;
use crate::utils::expiry::IggyExpiry;
use crate::utils::topic_size::MaxTopicSize;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub struct CreateTopic {
#[serde(skip)]
pub stream_id: Identifier,
pub partitions_count: u32,
pub compression_algorithm: CompressionAlgorithm,
pub message_expiry: IggyExpiry,
pub max_topic_size: MaxTopicSize,
pub replication_factor: Option<u8>,
pub name: String,
}
impl Default for CreateTopic {
fn default() -> Self {
CreateTopic {
stream_id: Identifier::default(),
partitions_count: 1,
compression_algorithm: CompressionAlgorithm::None,
message_expiry: IggyExpiry::NeverExpire,
max_topic_size: MaxTopicSize::ServerDefault,
replication_factor: None,
name: "topic".to_string(),
}
}
}
impl Validatable<IggyError> for CreateTopic {
fn validate(&self) -> Result<(), IggyError> {
if self.name.is_empty() || self.name.len() > MAX_NAME_LENGTH {
return Err(IggyError::InvalidTopicName);
}
if !(0..=MAX_PARTITIONS_COUNT).contains(&self.partitions_count) {
return Err(IggyError::TooManyPartitions);
}
if let Some(replication_factor) = self.replication_factor
&& replication_factor == 0
{
return Err(IggyError::InvalidReplicationFactor);
}
Ok(())
}
}