use serde::{Deserialize, Serialize}; use crate::core::{SledModel, Storable}; use std::collections::HashMap; /// Role represents the role of a member in a circle #[derive(Debug, Clone, Serialize, Deserialize)] pub enum Role { Admin, Stakeholder, Member, Contributor, Guest, } /// Member represents a member of a circle #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Member { pub pubkeys: Vec, // public keys of the member pub emails: Vec, // list of emails pub name: String, // name of the member pub description: String, // optional description pub role: Role, // role of the member in the circle } /// Circle represents a collection of members (users or other circles) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Circle { pub id: u32, // unique id pub name: String, // name of the circle pub description: String, // optional description pub members: Vec, // members of the circle } impl Circle { /// Create a new circle pub fn new(id: u32, name: String, description: String) -> Self { Self { id, name, description, members: Vec::new(), } } /// Add a member to the circle pub fn add_member(&mut self, member: Member) { self.members.push(member); } /// Returns a map of index keys for this circle pub fn index_keys(&self) -> HashMap { let mut keys = HashMap::new(); keys.insert("name".to_string(), self.name.clone()); keys } } // Implement Storable trait (provides default dump/load) impl Storable for Circle {} // Implement SledModel trait impl SledModel for Circle { fn get_id(&self) -> String { self.id.to_string() } fn db_prefix() -> &'static str { "circle" } }