use crate::commands::cli_command::{CliCommand, PRINT_TARGET};
use anyhow::Context;
use async_trait::async_trait;
use iggy_common::Client;
use iggy_common::Permissions;
use iggy_common::UserStatus;
use iggy_common::create_user::CreateUser;
use secrecy::{ExposeSecret, SecretString};
use tracing::{Level, event};
pub struct CreateUserCmd {
create_user: CreateUser,
}
impl CreateUserCmd {
pub fn new(
username: String,
password: String,
status: UserStatus,
permissions: Option<Permissions>,
) -> Self {
Self {
create_user: CreateUser {
username,
password: SecretString::from(password),
status,
permissions,
},
}
}
}
#[async_trait]
impl CliCommand for CreateUserCmd {
fn explain(&self) -> String {
format!("create user with username: {}", self.create_user.username)
}
async fn execute_cmd(&mut self, client: &dyn Client) -> anyhow::Result<(), anyhow::Error> {
client
.create_user(
&self.create_user.username,
self.create_user.password.expose_secret(),
self.create_user.status,
self.create_user.permissions.clone(),
)
.await
.with_context(|| {
format!(
"Problem creating user (username: {})",
self.create_user.username
)
})?;
event!(target: PRINT_TARGET, Level::INFO,
"User with username: {} created",
self.create_user.username
);
Ok(())
}
}