blob: 86df89e6ab897d8416008b7455856771b90291ee [file]
use crate::cli_command::{CliCommand, PRINT_TARGET};
use crate::client::Client;
use crate::identifier::Identifier;
use crate::models::permissions::{GlobalPermissions, StreamPermissions, TopicPermissions};
use crate::users::get_user::GetUser;
use anyhow::Context;
use async_trait::async_trait;
use comfy_table::presets::ASCII_NO_BORDERS;
use comfy_table::Table;
use tracing::{event, Level};
impl From<GlobalPermissions> for Table {
fn from(value: GlobalPermissions) -> Self {
let mut table = Self::new();
table.load_preset(ASCII_NO_BORDERS);
table.set_header(vec!["Permission", "Value"]);
table.add_row(vec![
"Manage Servers",
value.manage_servers.to_string().as_str(),
]);
table.add_row(vec![
"Read Servers",
value.read_servers.to_string().as_str(),
]);
table.add_row(vec![
"Manage Users",
value.manage_users.to_string().as_str(),
]);
table.add_row(vec!["Read Users", value.read_users.to_string().as_str()]);
table.add_row(vec![
"Manage Streams",
value.manage_streams.to_string().as_str(),
]);
table.add_row(vec![
"Read Streams",
value.read_streams.to_string().as_str(),
]);
table.add_row(vec![
"Manage Topics",
value.manage_topics.to_string().as_str(),
]);
table.add_row(vec!["Read Topics", value.read_topics.to_string().as_str()]);
table.add_row(vec![
"Poll Messages",
value.poll_messages.to_string().as_str(),
]);
table.add_row(vec![
"Send Messages",
value.send_messages.to_string().as_str(),
]);
table
}
}
impl From<&TopicPermissions> for Table {
fn from(value: &TopicPermissions) -> Self {
let mut table = Self::new();
table.load_preset(ASCII_NO_BORDERS);
table.set_header(vec!["Permission", "Value"]);
table.add_row(vec![
"Manage Topic",
value.manage_topic.to_string().as_str(),
]);
table.add_row(vec!["Read Topic", value.read_topic.to_string().as_str()]);
table.add_row(vec![
"Poll Messages",
value.poll_messages.to_string().as_str(),
]);
table.add_row(vec![
"Send Messages",
value.send_messages.to_string().as_str(),
]);
table
}
}
impl From<&StreamPermissions> for Table {
fn from(value: &StreamPermissions) -> Self {
let mut table = Self::new();
table.load_preset(ASCII_NO_BORDERS);
table.set_header(vec!["Permission", "Value"]);
table.add_row(vec![
"Manage Stream",
value.manage_stream.to_string().as_str(),
]);
table.add_row(vec!["Read Stream", value.read_stream.to_string().as_str()]);
table.add_row(vec![
"Manage Topics",
value.manage_topics.to_string().as_str(),
]);
table.add_row(vec!["Read Topics", value.read_topics.to_string().as_str()]);
table.add_row(vec![
"Poll Messages",
value.poll_messages.to_string().as_str(),
]);
table.add_row(vec![
"Send Messages",
value.send_messages.to_string().as_str(),
]);
if let Some(topics) = &value.topics {
topics.iter().for_each(|(topic_id, topic_permissions)| {
let topic_table: Table = topic_permissions.into();
table.add_row(vec![
format!("Topic: {}", topic_id).as_str(),
format!("{}", topic_table).as_str(),
]);
});
}
table
}
}
pub struct GetUserCmd {
get_user: GetUser,
}
impl GetUserCmd {
pub fn new(user_id: Identifier) -> Self {
Self {
get_user: GetUser { user_id },
}
}
}
#[async_trait]
impl CliCommand for GetUserCmd {
fn explain(&self) -> String {
format!("get user with ID: {}", self.get_user.user_id)
}
async fn execute_cmd(&mut self, client: &dyn Client) -> anyhow::Result<(), anyhow::Error> {
let user = client
.get_user(&self.get_user.user_id)
.await
.with_context(|| format!("Problem getting user with ID: {}", self.get_user.user_id))?;
if user.is_none() {
event!(
target: PRINT_TARGET,
Level::INFO,
"User with ID: {} was not found",
self.get_user.user_id
);
return Ok(());
}
let user = user.unwrap();
let mut table = Table::new();
table.set_header(vec!["Property", "Value"]);
table.add_row(vec!["User ID", format!("{}", user.id).as_str()]);
table.add_row(vec![
"Created",
user.created_at
.to_local_string("%Y-%m-%d %H:%M:%S")
.as_str(),
]);
table.add_row(vec!["Status", format!("{}", user.status).as_str()]);
table.add_row(vec!["Username", user.username.as_str()]);
if let Some(permissions) = user.permissions {
let global_permissions: Table = permissions.global.into();
table.add_row(vec!["Global", format!("{}", global_permissions).as_str()]);
if let Some(streams) = permissions.streams {
streams.iter().for_each(|(stream_id, stream_permissions)| {
let stream_permissions: Table = stream_permissions.into();
table.add_row(vec![
format!("Stream: {}", stream_id).as_str(),
format!("{}", stream_permissions).as_str(),
]);
});
}
};
event!(target: PRINT_TARGET, Level::INFO, "{table}");
Ok(())
}
}