Browse Source

Use RoomNotFoundError for all RoomMap manipulations.

wip
Titouan Rigoudy 9 years ago
parent
commit
cee0790b53
2 changed files with 72 additions and 46 deletions
  1. +26
    -38
      src/client.rs
  2. +46
    -8
      src/room.rs

+ 26
- 38
src/client.rs View File

@ -338,11 +338,14 @@ impl Client {
fn handle_room_join_response(&mut self, mut response: RoomJoinResponse) {
// Join the room and store the received information.
self.rooms.join(
let result = self.rooms.join(
&response.room_name, response.owner, response.operators,
&response.users).unwrap_or_else(
|err| error!("RoomJoinResponse: {}", err)
&response.users
);
if let Err(err) = result {
error!("RoomJoinResponse: {}", err);
return;
}
// Then update the user structs based on the info we just got.
for (name, user) in response.users.drain(..) {
@ -358,30 +361,8 @@ impl Client {
}
fn handle_room_leave_response(&mut self, response: RoomLeaveResponse) {
{
let room = match self.rooms.get_mut(&response.room_name) {
Some(room) => room,
None => {
error!(
"Cannot leave room: unknown room {:?}",
response.room_name,
);
return;
}
};
match room.membership {
room::Membership::Leaving => info!(
"Leaving room {:?}", response.room_name
),
membership => warn!(
"Leaving room {:?} with wrong membership: {:?}",
response.room_name, membership
),
}
room.membership = room::Membership::NonMember;
if let Err(err) = self.rooms.leave(&response.room_name) {
error!("RoomLeaveResponse: {}", err);
}
self.control_send(control::Response::RoomLeaveResponse(
@ -401,10 +382,14 @@ impl Client {
}
fn handle_room_message_response(&mut self, response: RoomMessageResponse) {
self.rooms.add_message(&response.room_name, room::Message {
let result = self.rooms.add_message(&response.room_name, room::Message {
user_name: response.user_name.clone(),
message: response.message.clone(),
});
if let Err(err) = result {
error!("RoomMessageResponse: {}", err);
return;
}
let control_response = control::RoomMessageResponse {
room_name: response.room_name,
@ -418,20 +403,23 @@ impl Client {
fn handle_user_joined_room_response(
&mut self, response: UserJoinedRoomResponse)
{
if let Some(room) = self.rooms.get_mut(&response.room_name) {
room.members.insert(response.user_name.clone());
self.users.insert(response.user_name, response.user);
} else {
error!(
"UserJoinedRoomResponse: unknown room \"{}\"",
response.room_name
);
let result = self.rooms.insert_member(
&response.room_name, response.user_name.clone()
);
match result {
Ok(()) => self.users.insert(response.user_name, response.user),
Err(err) => error!("UserJoinedRoomResponse: {}", err)
}
}
fn handle_user_status_response(&mut self, response: UserStatusResponse) {
self.users.set_status(&response.user_name, response.status)
.unwrap_or_else(|err| error!("UserStatusResponse: {}", err));
let result = self.users.set_status(
&response.user_name, response.status
);
if let Err(err) = result {
error!("UserStatusResponse: {}", err);
return;
}
if response.is_privileged {
self.users.insert_privileged(response.user_name);


+ 46
- 8
src/room.rs View File

@ -189,6 +189,8 @@ impl RoomMap {
rooms
}
/// Records that we are now a member of the given room and updates the room
/// information.
pub fn join(
&mut self, room_name: &str,
owner: Option<String>,
@ -232,16 +234,52 @@ impl RoomMap {
Ok(())
}
/// Records that we are now no longer a member of the given room.
pub fn leave(&mut self, room_name: &str) -> Result<(), RoomNotFoundError> {
let room = match self.map.get_mut(room_name) {
Some(room) => room,
None => return Err(RoomNotFoundError {
room_name: room_name.to_string()
}),
};
match room.membership {
Membership::Leaving => info!(
"Leaving room {:?}", room_name
),
membership => warn!(
"Leaving room {:?} with wrong membership: {:?}",
room_name, membership
),
}
room.membership = Membership::NonMember;
Ok(())
}
/// Saves the given message as the last one in the given room.
pub fn add_message(&mut self, room_name: &str, message: Message) {
match self.get_mut(room_name) {
None => {
error!(
"RoomMap::add_message: unknown room \"{}\"", room_name
);
return;
pub fn add_message(&mut self, room_name: &str, message: Message)
-> Result<(), RoomNotFoundError>
{
match self.map.get_mut(room_name) {
Some(room) => {
room.messages.push(message);
Ok(())
},
None => Err(RoomNotFoundError{ room_name: room_name.to_string() }),
}
}
/// Inserts the given user in the given room's set of members.
pub fn insert_member(&mut self, room_name: &str, user_name: String)
-> Result<(), RoomNotFoundError>
{
match self.map.get_mut(room_name) {
Some(room) => {
room.members.insert(user_name);
Ok(())
},
Some(room) => room.messages.push(message),
None => Err(RoomNotFoundError{ room_name: room_name.to_string() }),
}
}
}


Loading…
Cancel
Save