use crate::commands::cli_command::{CliCommand, PRINT_TARGET};
use anyhow::Context;
use async_trait::async_trait;
use comfy_table::Table;
use iggy_common::Client;
use iggy_common::Identifier;
use iggy_common::IggyExpiry;
use tracing::{Level, event};
pub struct GetTopicCmd {
stream_id: Identifier,
topic_id: Identifier,
}
impl GetTopicCmd {
pub fn new(stream_id: Identifier, topic_id: Identifier) -> Self {
Self {
stream_id,
topic_id,
}
}
}
#[async_trait]
impl CliCommand for GetTopicCmd {
fn explain(&self) -> String {
format!(
"get topic with ID: {} from stream with ID: {}",
self.topic_id, self.stream_id
)
}
async fn execute_cmd(&mut self, client: &dyn Client) -> anyhow::Result<(), anyhow::Error> {
let topic = client
.get_topic(&self.stream_id, &self.topic_id)
.await
.with_context(|| {
format!(
"Problem getting topic with ID: {} in stream {}",
self.topic_id, self.stream_id
)
})?;
if topic.is_none() {
event!(target: PRINT_TARGET, Level::INFO, "Topic with ID: {} in stream {} was not found", self.topic_id, self.stream_id);
return Ok(());
}
let topic = topic.unwrap();
let mut table = Table::new();
table.set_header(vec!["Property", "Value"]);
table.add_row(vec!["Topic id", format!("{}", topic.id).as_str()]);
table.add_row(vec![
"Created",
topic.created_at.to_utc_string("%Y-%m-%d %H:%M:%S").as_str(),
]);
table.add_row(vec!["Topic name", topic.name.as_str()]);
table.add_row(vec!["Topic size", format!("{}", topic.size).as_str()]);
table.add_row(vec![
"Compression",
topic.compression_algorithm.to_string().as_str(),
]);
table.add_row(vec![
"Message expiry",
match topic.message_expiry {
IggyExpiry::NeverExpire => String::from("unlimited"),
IggyExpiry::ServerDefault => String::from("server_default"),
IggyExpiry::ExpireDuration(value) => format!("{value}"),
}
.as_str(),
]);
table.add_row(vec![
"Max topic size",
format!("{}", topic.max_topic_size).as_str(),
]);
table.add_row(vec![
"Topic message count",
format!("{}", topic.messages_count).as_str(),
]);
table.add_row(vec![
"Partitions count",
format!("{}", topic.partitions_count).as_str(),
]);
event!(target: PRINT_TARGET, Level::INFO,"{table}");
Ok(())
}
}