#[derive(Debug, Clone, Default)]
pub struct DropUserStatement {
pub user_names: Vec<String>,
pub if_exists: bool,
}
impl DropUserStatement {
pub fn new() -> Self {
Self::default()
}
pub fn user(mut self, name: impl Into<String>) -> Self {
self.user_names.push(name.into());
self
}
pub fn users(mut self, names: Vec<String>) -> Self {
self.user_names = names;
self
}
pub fn if_exists(mut self, flag: bool) -> Self {
self.if_exists = flag;
self
}
pub fn validate(&self) -> Result<(), String> {
if self.user_names.is_empty() {
return Err("At least one user must be specified".to_string());
}
for (idx, user_name) in self.user_names.iter().enumerate() {
let trimmed = user_name.trim();
if trimmed.is_empty() {
return Err(format!(
"User name at index {} cannot be empty or whitespace only",
idx
));
}
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_drop_user_new() {
let stmt = DropUserStatement::new();
assert!(stmt.user_names.is_empty());
assert!(!stmt.if_exists);
}
#[test]
fn test_drop_user_basic() {
let stmt = DropUserStatement::new().user("app_user");
assert_eq!(stmt.user_names.len(), 1);
assert_eq!(stmt.user_names[0], "app_user");
assert!(stmt.validate().is_ok());
}
#[test]
fn test_drop_user_multiple() {
let stmt = DropUserStatement::new().user("user1").user("user2");
assert_eq!(stmt.user_names.len(), 2);
}
#[test]
fn test_drop_user_if_exists() {
let stmt = DropUserStatement::new().user("app_user").if_exists(true);
assert!(stmt.if_exists);
}
#[test]
fn test_drop_user_validation_empty() {
let stmt = DropUserStatement::new();
assert!(stmt.validate().is_err());
}
}