blob: ba8c0bebd60944ec7b680d959ae7c8e980a48eb3 [file]
use crate::cli_command::{CliCommand, PRINT_TARGET};
use crate::client::Client;
use crate::identifier::Identifier;
use crate::models::user_status::UserStatus;
use crate::users::update_user::UpdateUser;
use anyhow::Context;
use async_trait::async_trait;
use tracing::{event, Level};
#[derive(Debug, Clone)]
pub enum UpdateUserType {
Name(String),
Status(UserStatus),
}
pub struct UpdateUserCmd {
update_type: UpdateUserType,
update_user: UpdateUser,
}
impl UpdateUserCmd {
pub fn new(user_id: Identifier, update_type: UpdateUserType) -> Self {
let (username, status) = match update_type.clone() {
UpdateUserType::Name(username) => (Some(username), None),
UpdateUserType::Status(status) => (None, Some(status)),
};
UpdateUserCmd {
update_type,
update_user: UpdateUser {
user_id,
username,
status,
},
}
}
fn get_message(&self) -> String {
match &self.update_type {
UpdateUserType::Name(username) => format!("username: {}", username),
UpdateUserType::Status(status) => format!("status: {}", status),
}
}
}
#[async_trait]
impl CliCommand for UpdateUserCmd {
fn explain(&self) -> String {
format!(
"update user with ID: {} with {}",
self.update_user.user_id,
self.get_message()
)
}
async fn execute_cmd(&mut self, client: &dyn Client) -> anyhow::Result<(), anyhow::Error> {
client
.update_user(
&self.update_user.user_id,
self.update_user.username.as_deref(),
self.update_user.status,
)
.await
.with_context(|| {
format!(
"Problem updating user with ID: {} with {}",
self.update_user.user_id,
self.get_message()
)
})?;
event!(target: PRINT_TARGET, Level::INFO,
"User with ID: {} updated with {}",
self.update_user.user_id, self.get_message()
);
Ok(())
}
}