#[derive(Debug, Clone, PartialEq)]
pub enum RoleTarget {
Named(String),
None,
All,
AllExcept(Vec<String>),
Default,
}
#[derive(Debug, Clone, Default)]
pub struct SetRoleStatement {
pub target: Option<RoleTarget>,
}
impl SetRoleStatement {
pub fn new() -> Self {
Self::default()
}
pub fn role(mut self, target: RoleTarget) -> Self {
self.target = Some(target);
self
}
pub fn validate(&self) -> Result<(), String> {
match &self.target {
None => Err("Role target must be specified".to_string()),
Some(RoleTarget::Named(name)) if name.trim().is_empty() => {
Err("Role name cannot be empty or whitespace only".to_string())
}
Some(RoleTarget::AllExcept(list)) if list.is_empty() => {
Err("AllExcept role list cannot be empty".to_string())
}
Some(RoleTarget::AllExcept(list)) => {
for role in list {
if role.trim().is_empty() {
return Err(
"Role name in AllExcept list cannot be empty or whitespace only"
.to_string(),
);
}
}
Ok(())
}
_ => Ok(()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_set_role_new() {
let stmt = SetRoleStatement::new();
assert!(stmt.target.is_none());
}
#[test]
fn test_set_role_named() {
let stmt = SetRoleStatement::new().role(RoleTarget::Named("admin".to_string()));
assert!(matches!(stmt.target, Some(RoleTarget::Named(_))));
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_role_none() {
let stmt = SetRoleStatement::new().role(RoleTarget::None);
assert!(matches!(stmt.target, Some(RoleTarget::None)));
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_role_all() {
let stmt = SetRoleStatement::new().role(RoleTarget::All);
assert!(matches!(stmt.target, Some(RoleTarget::All)));
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_role_all_except() {
let stmt =
SetRoleStatement::new().role(RoleTarget::AllExcept(vec!["restricted".to_string()]));
assert!(matches!(stmt.target, Some(RoleTarget::AllExcept(_))));
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_role_default() {
let stmt = SetRoleStatement::new().role(RoleTarget::Default);
assert!(matches!(stmt.target, Some(RoleTarget::Default)));
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_role_validation_no_target() {
let stmt = SetRoleStatement::new();
assert!(stmt.validate().is_err());
}
#[test]
fn test_set_role_validation_empty_name() {
let stmt = SetRoleStatement::new().role(RoleTarget::Named("".to_string()));
assert!(stmt.validate().is_err());
}
#[test]
fn test_set_role_validation_empty_except_list() {
let stmt = SetRoleStatement::new().role(RoleTarget::AllExcept(vec![]));
assert!(stmt.validate().is_err());
}
}