use std::collections::HashMap;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct RoleManager {
owner: String,
roles: HashMap<String, Vec<String>>, }
#[wasm_bindgen]
impl RoleManager {
#[wasm_bindgen(constructor)]
pub fn new(owner: &str) -> RoleManager {
RoleManager {
owner: owner.to_string(),
roles: HashMap::new(),
}
}
pub fn get_owner(&self) -> String {
self.owner.clone()
}
pub fn transfer_ownership(&mut self, current_owner: &str, new_owner: &str) -> bool {
if current_owner != self.owner {
return false; }
self.owner = new_owner.to_string();
true
}
pub fn assign_role(&mut self, owner: &str, role: &str, user: &str) -> bool {
if owner != self.owner {
return false; }
let role_users = self.roles.entry(role.to_string()).or_insert(Vec::new());
if !role_users.contains(&user.to_string()) {
role_users.push(user.to_string());
}
true
}
pub fn remove_role(&mut self, owner: &str, role: &str, user: &str) -> bool {
if owner != self.owner {
return false; }
if let Some(role_users) = self.roles.get_mut(role) {
if let Some(index) = role_users.iter().position(|x| x == user) {
role_users.remove(index);
}
}
true
}
pub fn has_role(&self, role: &str, user: &str) -> bool {
if let Some(role_users) = self.roles.get(role) {
return role_users.contains(&user.to_string());
}
false
}
pub fn is_owner(&self, user: &str) -> bool {
self.owner == user
}
pub fn role_based_access(&self, user: &str, role: &str) -> bool {
self.is_owner(user) || self.has_role(role, user)
}
pub fn list_role_users(&self, role: &str) -> Vec<String> {
self.roles
.get(role)
.cloned()
.unwrap_or_else(Vec::new)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ownership_transfer() {
let mut role_manager = RoleManager::new("owner");
assert!(role_manager.transfer_ownership("owner", "new_owner"));
assert_eq!(role_manager.get_owner(), "new_owner");
assert!(!role_manager.transfer_ownership("wrong_user", "owner"));
}
#[test]
fn test_assign_role() {
let mut role_manager = RoleManager::new("owner");
assert!(role_manager.assign_role("owner", "admin", "user1"));
assert!(role_manager.has_role("admin", "user1"));
assert!(!role_manager.assign_role("wrong_user", "admin", "user2"));
}
#[test]
fn test_remove_role() {
let mut role_manager = RoleManager::new("owner");
role_manager.assign_role("owner", "admin", "user1");
assert!(role_manager.has_role("admin", "user1"));
assert!(role_manager.remove_role("owner", "admin", "user1"));
assert!(!role_manager.has_role("admin", "user1"));
assert!(!role_manager.remove_role("wrong_user", "admin", "user1"));
}
#[test]
fn test_role_based_access() {
let mut role_manager = RoleManager::new("owner");
assert!(role_manager.role_based_access("owner", "admin"));
role_manager.assign_role("owner", "admin", "user1");
assert!(role_manager.role_based_access("user1", "admin"));
assert!(!role_manager.role_based_access("user2", "admin"));
}
}