Browse Source

Implement From<*Request> for ServerRequest.

wip
Titouan Rigoudy 4 years ago
parent
commit
719480e99c
4 changed files with 223 additions and 46 deletions
  1. +28
    -28
      src/client.rs
  2. +1
    -2
      src/proto/server/client.rs
  3. +188
    -13
      src/proto/server/request.rs
  4. +6
    -3
      tests/connect.rs

+ 28
- 28
src/client.rs View File

@ -106,17 +106,16 @@ impl Client {
minor: config::VER_MINOR, minor: config::VER_MINOR,
}; };
self.send_to_server(server::ServerRequest::LoginRequest(
credentials.into_login_request(version),
));
self.send_to_server(credentials.into_login_request(version).into());
self.login_status = LoginStatus::AwaitingResponse; self.login_status = LoginStatus::AwaitingResponse;
self.send_to_server(server::ServerRequest::SetListenPortRequest(
self.send_to_server(
server::SetListenPortRequest { server::SetListenPortRequest {
port: config::LISTEN_PORT, port: config::LISTEN_PORT,
},
));
}
.into(),
);
loop { loop {
match self.recv() { match self.recv() {
@ -262,11 +261,12 @@ impl Client {
match self.rooms.start_joining(&room_name) { match self.rooms.start_joining(&room_name) {
Ok(()) => { Ok(()) => {
info!("Requesting to join room {:?}", room_name); info!("Requesting to join room {:?}", room_name);
self.send_to_server(server::ServerRequest::RoomJoinRequest(
self.send_to_server(
server::RoomJoinRequest { server::RoomJoinRequest {
room_name: room_name, room_name: room_name,
},
));
}
.into(),
);
} }
Err(err) => error!("RoomLeaveRequest: {}", err), Err(err) => error!("RoomLeaveRequest: {}", err),
@ -277,11 +277,12 @@ impl Client {
match self.rooms.start_leaving(&room_name) { match self.rooms.start_leaving(&room_name) {
Ok(()) => { Ok(()) => {
info!("Requesting to leave room {:?}", room_name); info!("Requesting to leave room {:?}", room_name);
self.send_to_server(server::ServerRequest::RoomLeaveRequest(
self.send_to_server(
server::RoomLeaveRequest { server::RoomLeaveRequest {
room_name: room_name, room_name: room_name,
},
));
}
.into(),
);
} }
Err(err) => error!("RoomLeaveRequest: {}", err), Err(err) => error!("RoomLeaveRequest: {}", err),
@ -303,12 +304,13 @@ impl Client {
&mut self, &mut self,
request: control::RoomMessageRequest, request: control::RoomMessageRequest,
) { ) {
self.send_to_server(server::ServerRequest::RoomMessageRequest(
self.send_to_server(
server::RoomMessageRequest { server::RoomMessageRequest {
room_name: request.room_name, room_name: request.room_name,
message: request.message, message: request.message,
},
));
}
.into(),
);
} }
fn handle_user_list_request(&mut self) { fn handle_user_list_request(&mut self) {
@ -382,13 +384,12 @@ impl Client {
self self
.proto_tx .proto_tx
.send(proto::Request::ServerRequest( .send(proto::Request::ServerRequest(
server::ServerRequest::ConnectToPeerRequest(
server::ConnectToPeerRequest {
token: peer.token,
user_name: peer.user_name.clone(),
connection_type: peer.connection_type.clone(),
},
),
server::ConnectToPeerRequest {
token: peer.token,
user_name: peer.user_name.clone(),
connection_type: peer.connection_type.clone(),
}
.into(),
)) ))
.unwrap(); .unwrap();
} }
@ -404,12 +405,11 @@ impl Client {
self self
.proto_tx .proto_tx
.send(proto::Request::ServerRequest( .send(proto::Request::ServerRequest(
server::ServerRequest::CannotConnectRequest(
server::CannotConnectRequest {
token: peer.token,
user_name: peer.user_name,
},
),
server::CannotConnectRequest {
token: peer.token,
user_name: peer.user_name,
}
.into(),
)) ))
.unwrap(); .unwrap();
} }


+ 1
- 2
src/proto/server/client.rs View File

@ -84,11 +84,10 @@ impl Client {
&mut self, &mut self,
options: ClientOptions, options: ClientOptions,
) -> Result<(), ClientLoginError> { ) -> Result<(), ClientLoginError> {
// TODO: Use into() once ServerRequest implements From<LoginRequest>.
let login_request = options.credentials.into_login_request(options.version); let login_request = options.credentials.into_login_request(options.version);
debug!("Client: sending login request: {:?}", login_request); debug!("Client: sending login request: {:?}", login_request);
let request = ServerRequest::LoginRequest(login_request);
let request = login_request.into();
self.frame_stream.write(&request).await?; self.frame_stream.write(&request).await?;
let response = self.frame_stream.read().await?; let response = self.frame_stream.read().await?;


+ 188
- 13
src/proto/server/request.rs View File

@ -11,7 +11,7 @@ use crate::proto::server::constants::*;
* SERVER REQUEST * * SERVER REQUEST *
*================*/ *================*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ServerRequest { pub enum ServerRequest {
CannotConnectRequest(CannotConnectRequest), CannotConnectRequest(CannotConnectRequest),
ConnectToPeerRequest(ConnectToPeerRequest), ConnectToPeerRequest(ConnectToPeerRequest),
@ -26,7 +26,65 @@ pub enum ServerRequest {
UserStatusRequest(UserStatusRequest), UserStatusRequest(UserStatusRequest),
} }
// TODO: Implement From<*Request> for ServerRequest.
impl From<CannotConnectRequest> for ServerRequest {
fn from(inner: CannotConnectRequest) -> ServerRequest {
ServerRequest::CannotConnectRequest(inner)
}
}
impl From<ConnectToPeerRequest> for ServerRequest {
fn from(inner: ConnectToPeerRequest) -> ServerRequest {
ServerRequest::ConnectToPeerRequest(inner)
}
}
impl From<FileSearchRequest> for ServerRequest {
fn from(inner: FileSearchRequest) -> ServerRequest {
ServerRequest::FileSearchRequest(inner)
}
}
impl From<LoginRequest> for ServerRequest {
fn from(inner: LoginRequest) -> ServerRequest {
ServerRequest::LoginRequest(inner)
}
}
impl From<PeerAddressRequest> for ServerRequest {
fn from(inner: PeerAddressRequest) -> ServerRequest {
ServerRequest::PeerAddressRequest(inner)
}
}
impl From<RoomJoinRequest> for ServerRequest {
fn from(inner: RoomJoinRequest) -> ServerRequest {
ServerRequest::RoomJoinRequest(inner)
}
}
impl From<RoomLeaveRequest> for ServerRequest {
fn from(inner: RoomLeaveRequest) -> ServerRequest {
ServerRequest::RoomLeaveRequest(inner)
}
}
impl From<RoomMessageRequest> for ServerRequest {
fn from(inner: RoomMessageRequest) -> ServerRequest {
ServerRequest::RoomMessageRequest(inner)
}
}
impl From<SetListenPortRequest> for ServerRequest {
fn from(inner: SetListenPortRequest) -> ServerRequest {
ServerRequest::SetListenPortRequest(inner)
}
}
impl From<UserStatusRequest> for ServerRequest {
fn from(inner: UserStatusRequest) -> ServerRequest {
ServerRequest::UserStatusRequest(inner)
}
}
impl WriteToPacket for ServerRequest { impl WriteToPacket for ServerRequest {
fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> {
@ -202,7 +260,7 @@ impl ValueDecode for ServerRequest {
* CANNOT CONNECT * * CANNOT CONNECT *
*================*/ *================*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CannotConnectRequest { pub struct CannotConnectRequest {
pub token: u32, pub token: u32,
pub user_name: String, pub user_name: String,
@ -235,7 +293,7 @@ impl ValueDecode for CannotConnectRequest {
* CONNECT TO PEER * * CONNECT TO PEER *
*=================*/ *=================*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ConnectToPeerRequest { pub struct ConnectToPeerRequest {
pub token: u32, pub token: u32,
pub user_name: String, pub user_name: String,
@ -276,7 +334,7 @@ impl ValueDecode for ConnectToPeerRequest {
* FILE SEARCH * * FILE SEARCH *
*=============*/ *=============*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct FileSearchRequest { pub struct FileSearchRequest {
pub ticket: u32, pub ticket: u32,
pub query: String, pub query: String,
@ -309,7 +367,7 @@ impl ValueDecode for FileSearchRequest {
* LOGIN * * LOGIN *
*=======*/ *=======*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct LoginRequest { pub struct LoginRequest {
// TODO: Rename to `user_name`. // TODO: Rename to `user_name`.
pub username: String, pub username: String,
@ -361,7 +419,7 @@ impl ValueDecode for LoginRequest {
* PEER ADDRESS * * PEER ADDRESS *
*==============*/ *==============*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PeerAddressRequest { pub struct PeerAddressRequest {
pub username: String, pub username: String,
} }
@ -390,7 +448,7 @@ impl ValueDecode for PeerAddressRequest {
* ROOM JOIN * * ROOM JOIN *
*===========*/ *===========*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RoomJoinRequest { pub struct RoomJoinRequest {
pub room_name: String, pub room_name: String,
} }
@ -421,7 +479,7 @@ impl ValueDecode for RoomJoinRequest {
* ROOM LEAVE * * ROOM LEAVE *
*============*/ *============*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RoomLeaveRequest { pub struct RoomLeaveRequest {
pub room_name: String, pub room_name: String,
} }
@ -452,7 +510,7 @@ impl ValueDecode for RoomLeaveRequest {
* ROOM MESSAGE * * ROOM MESSAGE *
*==============*/ *==============*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RoomMessageRequest { pub struct RoomMessageRequest {
pub room_name: String, pub room_name: String,
pub message: String, pub message: String,
@ -485,7 +543,7 @@ impl ValueDecode for RoomMessageRequest {
* SET LISTEN PORT * * SET LISTEN PORT *
*=================*/ *=================*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SetListenPortRequest { pub struct SetListenPortRequest {
pub port: u16, pub port: u16,
} }
@ -514,7 +572,7 @@ impl ValueDecode for SetListenPortRequest {
* USER STATUS * * USER STATUS *
*=============*/ *=============*/
#[derive(Debug, Eq, PartialEq)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct UserStatusRequest { pub struct UserStatusRequest {
pub user_name: String, pub user_name: String,
} }
@ -571,6 +629,18 @@ mod tests {
); );
} }
#[test]
fn from_cannot_connect_request() {
let request = CannotConnectRequest {
token: 1337,
user_name: "alice".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::CannotConnectRequest(request)
);
}
#[test] #[test]
fn roundtrip_cannot_connect_request() { fn roundtrip_cannot_connect_request() {
roundtrip(ServerRequest::CannotConnectRequest(CannotConnectRequest { roundtrip(ServerRequest::CannotConnectRequest(CannotConnectRequest {
@ -579,6 +649,19 @@ mod tests {
})) }))
} }
#[test]
fn from_connect_to_peer_request() {
let request = ConnectToPeerRequest {
token: 1337,
user_name: "alice".to_string(),
connection_type: "P".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::ConnectToPeerRequest(request)
);
}
#[test] #[test]
fn roundtrip_connect_to_peer_request() { fn roundtrip_connect_to_peer_request() {
roundtrip(ServerRequest::ConnectToPeerRequest(ConnectToPeerRequest { roundtrip(ServerRequest::ConnectToPeerRequest(ConnectToPeerRequest {
@ -588,6 +671,18 @@ mod tests {
})) }))
} }
#[test]
fn from_file_search_request() {
let request = FileSearchRequest {
ticket: 1337,
query: "foo.txt".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::FileSearchRequest(request)
);
}
#[test] #[test]
fn roundtrip_file_search_request() { fn roundtrip_file_search_request() {
roundtrip(ServerRequest::FileSearchRequest(FileSearchRequest { roundtrip(ServerRequest::FileSearchRequest(FileSearchRequest {
@ -596,6 +691,21 @@ mod tests {
})) }))
} }
#[test]
fn from_login_request() {
let request = LoginRequest {
username: "alice".to_string(),
password: "sekrit".to_string(),
digest: "abcdef".to_string(),
major: 13,
minor: 37,
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::LoginRequest(request)
);
}
#[test] #[test]
fn roundtrip_login_request() { fn roundtrip_login_request() {
roundtrip(ServerRequest::LoginRequest(LoginRequest { roundtrip(ServerRequest::LoginRequest(LoginRequest {
@ -607,6 +717,17 @@ mod tests {
})) }))
} }
#[test]
fn from_peer_address_request() {
let request = PeerAddressRequest {
username: "alice".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::PeerAddressRequest(request)
);
}
#[test] #[test]
fn roundtrip_peer_address_request() { fn roundtrip_peer_address_request() {
roundtrip(ServerRequest::PeerAddressRequest(PeerAddressRequest { roundtrip(ServerRequest::PeerAddressRequest(PeerAddressRequest {
@ -614,6 +735,17 @@ mod tests {
})) }))
} }
#[test]
fn from_room_join_request() {
let request = RoomJoinRequest {
room_name: "best room ever".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::RoomJoinRequest(request)
);
}
#[test] #[test]
fn roundtrip_room_join_request() { fn roundtrip_room_join_request() {
roundtrip(ServerRequest::RoomJoinRequest(RoomJoinRequest { roundtrip(ServerRequest::RoomJoinRequest(RoomJoinRequest {
@ -621,10 +753,21 @@ mod tests {
})) }))
} }
#[test]
fn from_room_leave_request() {
let request = RoomLeaveRequest {
room_name: "worst room ever".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::RoomLeaveRequest(request)
);
}
#[test] #[test]
fn roundtrip_room_leave_request() { fn roundtrip_room_leave_request() {
roundtrip(ServerRequest::RoomLeaveRequest(RoomLeaveRequest { roundtrip(ServerRequest::RoomLeaveRequest(RoomLeaveRequest {
room_name: "best room ever".to_string(),
room_name: "worst room ever".to_string(),
})) }))
} }
@ -633,6 +776,18 @@ mod tests {
roundtrip(ServerRequest::RoomListRequest) roundtrip(ServerRequest::RoomListRequest)
} }
#[test]
fn from_room_message_request() {
let request = RoomMessageRequest {
room_name: "best room ever".to_string(),
message: "hello world!".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::RoomMessageRequest(request)
);
}
#[test] #[test]
fn roundtrip_room_message_request() { fn roundtrip_room_message_request() {
roundtrip(ServerRequest::RoomMessageRequest(RoomMessageRequest { roundtrip(ServerRequest::RoomMessageRequest(RoomMessageRequest {
@ -641,6 +796,15 @@ mod tests {
})) }))
} }
#[test]
fn from_set_listen_port_request() {
let request = SetListenPortRequest { port: 1337 };
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::SetListenPortRequest(request)
);
}
#[test] #[test]
fn roundtrip_set_listen_port_request() { fn roundtrip_set_listen_port_request() {
roundtrip(ServerRequest::SetListenPortRequest(SetListenPortRequest { roundtrip(ServerRequest::SetListenPortRequest(SetListenPortRequest {
@ -648,6 +812,17 @@ mod tests {
})) }))
} }
#[test]
fn from_user_status_request() {
let request = UserStatusRequest {
user_name: "alice".to_string(),
};
assert_eq!(
ServerRequest::from(request.clone()),
ServerRequest::UserStatusRequest(request)
);
}
#[test] #[test]
fn roundtrip_user_status_request() { fn roundtrip_user_status_request() {
roundtrip(ServerRequest::UserStatusRequest(UserStatusRequest { roundtrip(ServerRequest::UserStatusRequest(UserStatusRequest {


+ 6
- 3
tests/connect.rs View File

@ -66,9 +66,12 @@ async fn integration_check_user_status() {
let mut inbound = client.run(outbound); let mut inbound = client.run(outbound);
request_tx request_tx
.send(ServerRequest::UserStatusRequest(UserStatusRequest {
user_name: user_name.clone(),
}))
.send(
UserStatusRequest {
user_name: user_name.clone(),
}
.into(),
)
.await .await
.unwrap(); .unwrap();


Loading…
Cancel
Save