use std::{
collections::HashMap,
sync::{Arc, Mutex},
};
use actix::Addr;
use medea_client_api_proto::RoomId;
use crate::{
api::{client::RpcServerRepository, RpcServer},
signalling::Room,
};
#[derive(Clone, Debug, Default)]
pub struct RoomRepository {
rooms: Arc<Mutex<HashMap<RoomId, Addr<Room>>>>,
}
#[cfg(test)]
impl From<HashMap<RoomId, Addr<Room>>> for RoomRepository {
fn from(rooms: HashMap<RoomId, Addr<Room>>) -> Self {
Self {
rooms: Arc::new(Mutex::new(rooms)),
}
}
}
impl RoomRepository {
#[inline]
#[must_use]
pub fn new() -> Self {
Self {
rooms: Arc::new(Mutex::new(HashMap::new())),
}
}
#[allow(clippy::missing_panics_doc)]
#[inline]
#[must_use]
pub fn get(&self, id: &RoomId) -> Option<Addr<Room>> {
let rooms = self.rooms.lock().unwrap();
rooms.get(id).cloned()
}
#[allow(clippy::missing_panics_doc)]
pub fn remove(&self, id: &RoomId) {
self.rooms.lock().unwrap().remove(id);
}
#[allow(clippy::missing_panics_doc)]
pub fn add(&self, id: RoomId, room: Addr<Room>) {
self.rooms.lock().unwrap().insert(id, room);
}
#[allow(clippy::missing_panics_doc)]
#[inline]
#[must_use]
pub fn contains_room_with_id(&self, id: &RoomId) -> bool {
self.rooms.lock().unwrap().contains_key(id)
}
}
impl RpcServerRepository for RoomRepository {
#[inline]
fn get(&self, room_id: &RoomId) -> Option<Box<dyn RpcServer>> {
self.get(room_id).map(|r| Box::new(r) as Box<dyn RpcServer>)
}
}