visions-vtt/servilo/src/rajtigo.rs

75 lines
2.2 KiB
Rust
Raw Normal View History

use crate::aŭtentigo::Uzantnomo;
use std::collections::{HashMap, HashSet};
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Rajto(String);
impl From<&str> for Rajto {
fn from(s: &str) -> Self {
Rajto(s.to_owned())
}
}
impl From<Rajto> for String {
fn from(s: Rajto) -> Self {
s.0.clone()
}
}
pub trait Rajtigo {
fn havas_rajton<'a, F>(&'a self, uzantnomo: Uzantnomo, provo: F) -> bool
where
F: FnOnce(&mut (dyn Iterator<Item = &'a Rajto> + 'a)) -> bool;
fn rajtoj(&self, uzantnomo: &Uzantnomo) -> Vec<Rajto>;
fn aldonu_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator<Item = Rajto>));
fn foriru_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator<Item = Rajto>));
fn foriru_uzanto(&mut self, uzantnomo: Uzantnomo);
}
pub struct MemRajtigo {
rajtoj: HashMap<Uzantnomo, HashSet<Rajto>>,
}
impl MemRajtigo {
pub fn new() -> Self {
MemRajtigo {
rajtoj: HashMap::new(),
}
}
}
impl Rajtigo for MemRajtigo {
fn havas_rajton<'a, F>(&'a self, uzantnomo: Uzantnomo, provo: F) -> bool
where
F: FnOnce(&mut (dyn Iterator<Item = &'a Rajto> + 'a)) -> bool,
{
match self.rajtoj.get(&uzantnomo) {
Some(rajtoj) => provo(&mut rajtoj.iter()),
None => false,
}
}
fn rajtoj(&self, uzantnomo: &Uzantnomo) -> Vec<Rajto> {
self.rajtoj
.get(&uzantnomo)
.map(|r| r.into_iter().cloned().collect::<Vec<Rajto>>())
.unwrap_or(vec![])
}
fn aldonu_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator<Item = Rajto>)) {
let valoro = self.rajtoj.entry(uzantnomo).or_insert(HashSet::new());
while let Some(r) = rajtoj.next() {
valoro.insert(r);
}
}
fn foriru_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator<Item = Rajto>)) {
let valoro = self.rajtoj.entry(uzantnomo).or_insert(HashSet::new());
while let Some(r) = rajtoj.next() {
valoro.remove(&r);
}
}
fn foriru_uzanto(&mut self, uzantnomo: Uzantnomo) {
let _ = self.rajtoj.remove(&uzantnomo);
}
}