use malwaredb_server::State;
use std::process::ExitCode;
use anyhow::{ensure, Result};
use clap::Parser;
#[derive(Clone, Debug, Parser, PartialEq)]
pub struct AddUser {
#[arg(short, long)]
pub uid: u32,
#[arg(short, long)]
pub gid: u32,
}
impl AddUser {
pub async fn execute(&self, state: State) -> Result<ExitCode> {
let users = state.db_type.list_users().await?;
ensure!(
users.iter().any(|u| u.id == self.uid),
"User ID {} is not valid.",
self.uid
);
let groups = state.db_type.list_groups().await?;
ensure!(
groups.iter().any(|g| g.id == self.gid),
"Group ID {} is not valid.",
self.gid
);
state.db_type.add_user_to_group(self.uid, self.gid).await?;
Ok(ExitCode::SUCCESS)
}
}
#[derive(Clone, Debug, Parser, PartialEq)]
pub struct Create {
#[arg(short, long)]
pub name: String,
#[arg(short, long)]
pub description: String,
#[arg(short, long)]
pub parent: Option<u32>,
}
impl Create {
pub async fn execute(&self, state: State) -> Result<ExitCode> {
let gid = state
.db_type
.create_group(&self.name, &self.description, self.parent)
.await?;
println!("Created group {} with ID: {gid}.", self.name);
Ok(ExitCode::SUCCESS)
}
}
#[derive(Clone, Debug, Parser, PartialEq)]
pub struct List {
#[arg(short, long, default_value = "false")]
pub members: bool,
#[arg(short, long, default_value = "false")]
pub sources: bool,
}
impl List {
pub async fn execute(&self, state: State) -> Result<ExitCode> {
for group in state.db_type.list_groups().await? {
println!("{group}");
}
Ok(ExitCode::SUCCESS)
}
}