Browse Source

Handle user list request.

wip
Titouan Rigoudy 4 years ago
parent
commit
35da08bf5c
5 changed files with 106 additions and 5 deletions
  1. +3
    -3
      client/src/control/response.rs
  2. +7
    -1
      client/src/dispatcher.rs
  3. +2
    -0
      client/src/handlers/mod.rs
  4. +94
    -0
      client/src/handlers/user_list_request_handler.rs
  5. +0
    -1
      client/src/user.rs

+ 3
- 3
client/src/control/response.rs View File

@ -99,7 +99,7 @@ pub struct UserInfoResponse {
/// This stuct contains the last known information about every user.
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct UserListResponse {
pub user_list: Vec<(String, User)>,
pub users: Vec<(String, User)>,
}
#[cfg(test)]
@ -359,7 +359,7 @@ mod tests {
assert_eq!(
serde_json::from_str::<UserListResponse>(
r#"{
"user_list": [
"users": [
["karandeep", {
"name": "karandeep",
"status": "Online",
@ -376,7 +376,7 @@ mod tests {
)
.unwrap(),
UserListResponse {
user_list: vec![(
users: vec![(
"karandeep".to_string(),
User {
name: "karandeep".to_string(),


+ 7
- 1
client/src/dispatcher.rs View File

@ -11,7 +11,7 @@ use crate::handlers::{
LoginStatusRequestHandler, PrivilegedUsersResponseHandler,
RoomJoinRequestHandler, RoomJoinResponseHandler, RoomListRequestHandler,
RoomListResponseHandler, RoomMessageRequestHandler,
RoomMessageResponseHandler,
RoomMessageResponseHandler, UserListRequestHandler,
};
use crate::message_handler::MessageHandler;
@ -128,6 +128,12 @@ impl Dispatcher {
handler: RoomJoinRequestHandler::default(),
}))
}
Message::ControlRequest(ControlRequest::UserListRequest) => {
Some(Box::new(DispatchedMessage {
message: (),
handler: UserListRequestHandler::default(),
}))
}
Message::ControlRequest(request) => {
warn!("Unhandled control request: {:?}", request);
None


+ 2
- 0
client/src/handlers/mod.rs View File

@ -6,6 +6,7 @@ mod room_list_request_handler;
mod room_list_response_handler;
mod room_message_request_handler;
mod room_message_response_handler;
mod user_list_request_handler;
pub use login_status_request_handler::LoginStatusRequestHandler;
pub use privileged_users_response_handler::PrivilegedUsersResponseHandler;
@ -15,3 +16,4 @@ pub use room_list_request_handler::RoomListRequestHandler;
pub use room_list_response_handler::RoomListResponseHandler;
pub use room_message_request_handler::RoomMessageRequestHandler;
pub use room_message_response_handler::RoomMessageResponseHandler;
pub use user_list_request_handler::UserListRequestHandler;

+ 94
- 0
client/src/handlers/user_list_request_handler.rs View File

@ -0,0 +1,94 @@
use anyhow::Context as AnyhowContext;
use crate::context::Context;
use crate::control::{Response, UserListResponse};
use crate::message_handler::MessageHandler;
#[derive(Debug, Default)]
pub struct UserListRequestHandler;
impl MessageHandler for UserListRequestHandler {
type Message = ();
fn run(self, context: &mut Context, _message: &()) -> anyhow::Result<()> {
let users = context.state.users.get_list();
let control_response =
Response::UserListResponse(UserListResponse { users });
context
.control_response_tx
.blocking_send(control_response)
.context("sending control response")?;
Ok(())
}
fn name() -> String {
"UserListRequestHandler".to_string()
}
}
#[cfg(test)]
mod tests {
use solstice_proto::{User, UserStatus};
use crate::context::{ContextBundle, ContextOptions};
use crate::control::{Response, UserListResponse};
use crate::message_handler::MessageHandler;
use super::UserListRequestHandler;
// Cannot get the compiler to be satisfied when borrowing the name...
fn user_name(pair: &(String, User)) -> String {
pair.0.clone()
}
#[test]
fn run_sends_response() {
let shruti = User {
name: "shruti".to_string(),
status: UserStatus::Online,
average_speed: 1,
num_downloads: 2,
unknown: 3,
num_files: 4,
num_folders: 5,
num_free_slots: 6,
country: "IN".to_string(),
};
let yao = User {
name: "yao".to_string(),
status: UserStatus::Away,
average_speed: 11,
num_downloads: 12,
unknown: 13,
num_files: 14,
num_folders: 15,
num_free_slots: 16,
country: "CN".to_string(),
};
let mut options = ContextOptions::default();
options.initial_state.users.insert(shruti.clone());
options.initial_state.users.insert(yao.clone());
let mut bundle = ContextBundle::new(options);
UserListRequestHandler::default()
.run(&mut bundle.context, &())
.unwrap();
let response = bundle.control_response_rx.blocking_recv().unwrap();
let mut users = match response {
Response::UserListResponse(UserListResponse { users }) => users,
_ => panic!("Unexpected control response: {:?}", response),
};
users.sort_by_key(user_name);
assert_eq!(
users,
vec![("shruti".to_string(), shruti), ("yao".to_string(), yao)]
);
}
}

+ 0
- 1
client/src/user.rs View File

@ -77,7 +77,6 @@ impl UserMap {
Ok(())
}
#[cfg(test)]
/// Returns the list of (user name, user data) representing all known users.
pub fn get_list(&self) -> Vec<(String, User)> {
let mut users = Vec::new();


Loading…
Cancel
Save