use std::cmp::Ordering; use enostr::Keypair; use crate::key_storage::KeyStorage; pub use crate::user_account::UserAccount; /// The interface for managing the user's accounts. /// Represents all user-facing operations related to account management. pub struct AccountManager { currently_selected_account: Option, accounts: Vec, key_store: KeyStorage, } impl AccountManager { pub fn new(currently_selected_account: Option, key_store: KeyStorage) -> Self { let accounts = key_store.get_keys().unwrap_or_default(); AccountManager { currently_selected_account, accounts, key_store, } } pub fn get_accounts(&self) -> &Vec { &self.accounts } pub fn get_account(&self, ind: usize) -> Option<&UserAccount> { self.accounts.get(ind) } pub fn find_account(&self, pk: &[u8; 32]) -> Option<&UserAccount> { self.accounts.iter().find(|acc| acc.pubkey.bytes() == pk) } pub fn remove_account(&mut self, index: usize) { if let Some(account) = self.accounts.get(index) { let _ = self.key_store.remove_key(account); self.accounts.remove(index); if let Some(selected_index) = self.currently_selected_account { match selected_index.cmp(&index) { Ordering::Greater => { self.select_account(selected_index - 1); } Ordering::Equal => { self.clear_selected_account(); } Ordering::Less => {} } } } } pub fn add_account(&mut self, account: Keypair) { let _ = self.key_store.add_key(&account); self.accounts.push(account) } pub fn num_accounts(&self) -> usize { self.accounts.len() } pub fn get_selected_account_index(&self) -> Option { self.currently_selected_account } pub fn get_selected_account(&self) -> Option<&UserAccount> { if let Some(account_index) = self.currently_selected_account { if let Some(account) = self.get_account(account_index) { Some(account) } else { None } } else { None } } pub fn select_account(&mut self, index: usize) { if self.accounts.get(index).is_some() { self.currently_selected_account = Some(index) } } pub fn clear_selected_account(&mut self) { self.currently_selected_account = None } }