|
|
|
@ -5,7 +5,7 @@ use log::{error, info, warn}; |
|
|
|
use solstice_proto::{server, User};
|
|
|
|
use thiserror::Error;
|
|
|
|
|
|
|
|
use crate::room::{Membership, Room, Visibility};
|
|
|
|
use crate::room::{Membership, RoomState, Visibility};
|
|
|
|
|
|
|
|
/// The error returned by RoomMap functions.
|
|
|
|
#[derive(Debug, Error)]
|
|
|
|
@ -26,7 +26,7 @@ pub struct RoomNotFoundError(String); |
|
|
|
#[derive(Debug, Default)]
|
|
|
|
pub struct RoomMap {
|
|
|
|
/// The actual map from room names to room data.
|
|
|
|
map: HashMap<String, Room>,
|
|
|
|
map: HashMap<String, RoomState>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl RoomMap {
|
|
|
|
@ -37,7 +37,7 @@ impl RoomMap { |
|
|
|
|
|
|
|
/// Inserts the given room in the map under the given name.
|
|
|
|
/// Same semantics as `std::collections::HashMap::insert()`.
|
|
|
|
pub fn insert(&mut self, name: String, room: Room) -> Option<Room> {
|
|
|
|
pub fn insert(&mut self, name: String, room: RoomState) -> Option<RoomState> {
|
|
|
|
self.map.insert(name, room)
|
|
|
|
}
|
|
|
|
|
|
|
|
@ -46,7 +46,7 @@ impl RoomMap { |
|
|
|
pub fn get_strict(
|
|
|
|
&self,
|
|
|
|
room_name: &str,
|
|
|
|
) -> Result<&Room, RoomNotFoundError> {
|
|
|
|
) -> Result<&RoomState, RoomNotFoundError> {
|
|
|
|
match self.map.get(room_name) {
|
|
|
|
Some(room) => Ok(room),
|
|
|
|
None => Err(RoomNotFoundError(room_name.to_string())),
|
|
|
|
@ -58,7 +58,7 @@ impl RoomMap { |
|
|
|
pub fn get_mut_strict(
|
|
|
|
&mut self,
|
|
|
|
room_name: &str,
|
|
|
|
) -> Result<&mut Room, RoomNotFoundError> {
|
|
|
|
) -> Result<&mut RoomState, RoomNotFoundError> {
|
|
|
|
match self.map.get_mut(room_name) {
|
|
|
|
Some(room) => Ok(room),
|
|
|
|
None => Err(RoomNotFoundError(room_name.to_string())),
|
|
|
|
@ -72,10 +72,10 @@ impl RoomMap { |
|
|
|
name: String,
|
|
|
|
visibility: Visibility,
|
|
|
|
user_count: u32,
|
|
|
|
old_map: &mut HashMap<String, Room>,
|
|
|
|
old_map: &mut HashMap<String, RoomState>,
|
|
|
|
) {
|
|
|
|
let room = match old_map.remove(&name) {
|
|
|
|
None => Room::new(Visibility::Public, user_count as usize),
|
|
|
|
None => RoomState::new(Visibility::Public, user_count as usize),
|
|
|
|
Some(mut room) => {
|
|
|
|
room.visibility = visibility;
|
|
|
|
room.user_count = user_count as usize;
|
|
|
|
@ -118,7 +118,7 @@ impl RoomMap { |
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the list of (room name, room data) representing all known rooms.
|
|
|
|
pub fn get_room_list(&self) -> Vec<(String, Room)> {
|
|
|
|
pub fn get_room_list(&self) -> Vec<(String, RoomState)> {
|
|
|
|
let mut rooms = Vec::new();
|
|
|
|
for (room_name, room) in self.map.iter() {
|
|
|
|
rooms.push((room_name.clone(), room.clone()));
|
|
|
|
@ -153,7 +153,7 @@ impl RoomMap { |
|
|
|
owner: Option<String>,
|
|
|
|
mut operators: Vec<String>,
|
|
|
|
members: &[User],
|
|
|
|
) -> Result<&Room, RoomError> {
|
|
|
|
) -> Result<&RoomState, RoomError> {
|
|
|
|
// First look up the room struct.
|
|
|
|
let room = self.get_mut_strict(room_name)?;
|
|
|
|
|
|
|
|
@ -267,7 +267,9 @@ mod tests { |
|
|
|
|
|
|
|
use solstice_proto::server::RoomListResponse;
|
|
|
|
|
|
|
|
use crate::room::{Membership, Message, MessageHistory, Room, Visibility};
|
|
|
|
use crate::room::{
|
|
|
|
Membership, Message, MessageHistory, RoomState, Visibility,
|
|
|
|
};
|
|
|
|
|
|
|
|
use super::RoomMap;
|
|
|
|
|
|
|
|
@ -311,7 +313,7 @@ mod tests { |
|
|
|
#[test]
|
|
|
|
fn deserialize_room() {
|
|
|
|
assert_eq!(
|
|
|
|
serde_json::from_str::<Room>(
|
|
|
|
serde_json::from_str::<RoomState>(
|
|
|
|
r#"{
|
|
|
|
"membership": "Joining",
|
|
|
|
"visibility": "PrivateOwned",
|
|
|
|
@ -336,7 +338,7 @@ mod tests { |
|
|
|
}"#
|
|
|
|
)
|
|
|
|
.unwrap(),
|
|
|
|
Room {
|
|
|
|
RoomState {
|
|
|
|
membership: Membership::Joining,
|
|
|
|
visibility: Visibility::PrivateOwned,
|
|
|
|
operated: false,
|
|
|
|
@ -387,7 +389,7 @@ mod tests { |
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
rooms.get_strict("room a").unwrap(),
|
|
|
|
&Room::new(Visibility::Public, 42)
|
|
|
|
&RoomState::new(Visibility::Public, 42)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|