use {log::*, std::collections::HashSet}; #[derive(Debug)] pub(crate) struct AccountsSelector { pub accounts: HashSet>, pub owners: HashSet>, pub select_all_accounts: bool, } impl AccountsSelector { pub fn default() -> Self { AccountsSelector { accounts: HashSet::default(), owners: HashSet::default(), select_all_accounts: true, } } pub fn new(accounts: &[String], owners: &[String]) -> Self { info!( "Creating AccountsSelector from accounts: {:?}, owners: {:?}", accounts, owners ); let select_all_accounts = accounts.iter().any(|key| key == "*"); if select_all_accounts { return AccountsSelector { accounts: HashSet::default(), owners: HashSet::default(), select_all_accounts, }; } let accounts = accounts .iter() .map(|key| bs58::decode(key).into_vec().unwrap()) .collect(); let owners = owners .iter() .map(|key| bs58::decode(key).into_vec().unwrap()) .collect(); AccountsSelector { accounts, owners, select_all_accounts, } } pub fn is_account_selected(&self, account: &[u8], owner: &[u8]) -> bool { self.select_all_accounts || self.accounts.contains(account) || self.owners.contains(owner) } } #[cfg(test)] pub(crate) mod tests { use super::*; #[test] fn test_create_accounts_selector() { AccountsSelector::new( &["9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin".to_string()], &[], ); AccountsSelector::new( &[], &["9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin".to_string()], ); } }