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 tracing::{Level, event};
pub struct GetUserCmd {
user_id: Identifier,
}
impl GetUserCmd {
pub fn new(user_id: Identifier) -> Self {
Self { user_id }
}
}
#[async_trait]
impl CliCommand for GetUserCmd {
fn explain(&self) -> String {
format!("get user with ID: {}", self.user_id)
}
async fn execute_cmd(&mut self, client: &dyn Client) -> anyhow::Result<(), anyhow::Error> {
let user = client
.get_user(&self.user_id)
.await
.with_context(|| format!("Problem getting user with ID: {}", self.user_id))?;
if user.is_none() {
event!(
target: PRINT_TARGET,
Level::INFO,
"User with ID: {} was not found",
self.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(())
}
}