use std::collections::HashMap;
use std::sync::Arc;
use grammers_session::Session;
use grammers_session::types::{PeerId, PeerRef};
use crate::peer::{Peer, User};
#[derive(Clone)]
pub struct PeerMap {
pub(crate) map: Arc<HashMap<PeerId, Peer>>,
pub(crate) session: Arc<dyn Session>,
}
impl PeerMap {
pub fn get(&self, peer: PeerId) -> Option<&Peer> {
self.map.get(&peer)
}
pub async fn get_ref(&self, peer: PeerId) -> Option<PeerRef> {
match self.map.get(&peer) {
Some(peer) => peer.to_ref().await,
None => self.session.peer_ref(peer).await,
}
}
pub fn take(&mut self, peer: PeerId) -> Option<Peer> {
match Arc::get_mut(&mut self.map) {
Some(map) => map.remove(&peer),
None => self.get(peer).cloned(),
}
}
pub(crate) fn take_user(&mut self, user_id: i64) -> Option<User> {
self.take(PeerId::user_unchecked(user_id))
.map(|peer| match peer {
Peer::User(user) => user,
_ => unreachable!(),
})
}
pub fn iter(&self) -> impl Iterator<Item = (PeerId, &Peer)> {
self.map.iter().map(|(k, v)| (*k, v))
}
pub fn iter_peers(&self) -> impl Iterator<Item = &Peer> {
self.map.values()
}
pub fn handle(&self) -> Self {
Self {
map: Arc::clone(&self.map),
session: Arc::clone(&self.session),
}
}
}