diff --git a/src/client.rs b/src/client.rs index d531a62..212e3f2 100644 --- a/src/client.rs +++ b/src/client.rs @@ -106,17 +106,16 @@ impl Client { 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.send_to_server(server::ServerRequest::SetListenPortRequest( + self.send_to_server( server::SetListenPortRequest { port: config::LISTEN_PORT, - }, - )); + } + .into(), + ); loop { match self.recv() { @@ -262,11 +261,12 @@ impl Client { match self.rooms.start_joining(&room_name) { Ok(()) => { info!("Requesting to join room {:?}", room_name); - self.send_to_server(server::ServerRequest::RoomJoinRequest( + self.send_to_server( server::RoomJoinRequest { room_name: room_name, - }, - )); + } + .into(), + ); } Err(err) => error!("RoomLeaveRequest: {}", err), @@ -277,11 +277,12 @@ impl Client { match self.rooms.start_leaving(&room_name) { Ok(()) => { info!("Requesting to leave room {:?}", room_name); - self.send_to_server(server::ServerRequest::RoomLeaveRequest( + self.send_to_server( server::RoomLeaveRequest { room_name: room_name, - }, - )); + } + .into(), + ); } Err(err) => error!("RoomLeaveRequest: {}", err), @@ -303,12 +304,13 @@ impl Client { &mut self, request: control::RoomMessageRequest, ) { - self.send_to_server(server::ServerRequest::RoomMessageRequest( + self.send_to_server( server::RoomMessageRequest { room_name: request.room_name, message: request.message, - }, - )); + } + .into(), + ); } fn handle_user_list_request(&mut self) { @@ -382,13 +384,12 @@ impl Client { self .proto_tx .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(); } @@ -404,12 +405,11 @@ impl Client { self .proto_tx .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(); } diff --git a/src/proto/server/client.rs b/src/proto/server/client.rs index 7110693..3039ad2 100644 --- a/src/proto/server/client.rs +++ b/src/proto/server/client.rs @@ -84,11 +84,10 @@ impl Client { &mut self, options: ClientOptions, ) -> Result<(), ClientLoginError> { - // TODO: Use into() once ServerRequest implements From. let login_request = options.credentials.into_login_request(options.version); debug!("Client: sending login request: {:?}", login_request); - let request = ServerRequest::LoginRequest(login_request); + let request = login_request.into(); self.frame_stream.write(&request).await?; let response = self.frame_stream.read().await?; diff --git a/src/proto/server/request.rs b/src/proto/server/request.rs index b526678..98e02bc 100644 --- a/src/proto/server/request.rs +++ b/src/proto/server/request.rs @@ -11,7 +11,7 @@ use crate::proto::server::constants::*; * SERVER REQUEST * *================*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub enum ServerRequest { CannotConnectRequest(CannotConnectRequest), ConnectToPeerRequest(ConnectToPeerRequest), @@ -26,7 +26,65 @@ pub enum ServerRequest { UserStatusRequest(UserStatusRequest), } -// TODO: Implement From<*Request> for ServerRequest. +impl From for ServerRequest { + fn from(inner: CannotConnectRequest) -> ServerRequest { + ServerRequest::CannotConnectRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: ConnectToPeerRequest) -> ServerRequest { + ServerRequest::ConnectToPeerRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: FileSearchRequest) -> ServerRequest { + ServerRequest::FileSearchRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: LoginRequest) -> ServerRequest { + ServerRequest::LoginRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: PeerAddressRequest) -> ServerRequest { + ServerRequest::PeerAddressRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: RoomJoinRequest) -> ServerRequest { + ServerRequest::RoomJoinRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: RoomLeaveRequest) -> ServerRequest { + ServerRequest::RoomLeaveRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: RoomMessageRequest) -> ServerRequest { + ServerRequest::RoomMessageRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: SetListenPortRequest) -> ServerRequest { + ServerRequest::SetListenPortRequest(inner) + } +} + +impl From for ServerRequest { + fn from(inner: UserStatusRequest) -> ServerRequest { + ServerRequest::UserStatusRequest(inner) + } +} impl WriteToPacket for ServerRequest { fn write_to_packet(&self, packet: &mut MutPacket) -> io::Result<()> { @@ -202,7 +260,7 @@ impl ValueDecode for ServerRequest { * CANNOT CONNECT * *================*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct CannotConnectRequest { pub token: u32, pub user_name: String, @@ -235,7 +293,7 @@ impl ValueDecode for CannotConnectRequest { * CONNECT TO PEER * *=================*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct ConnectToPeerRequest { pub token: u32, pub user_name: String, @@ -276,7 +334,7 @@ impl ValueDecode for ConnectToPeerRequest { * FILE SEARCH * *=============*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct FileSearchRequest { pub ticket: u32, pub query: String, @@ -309,7 +367,7 @@ impl ValueDecode for FileSearchRequest { * LOGIN * *=======*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct LoginRequest { // TODO: Rename to `user_name`. pub username: String, @@ -361,7 +419,7 @@ impl ValueDecode for LoginRequest { * PEER ADDRESS * *==============*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct PeerAddressRequest { pub username: String, } @@ -390,7 +448,7 @@ impl ValueDecode for PeerAddressRequest { * ROOM JOIN * *===========*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct RoomJoinRequest { pub room_name: String, } @@ -421,7 +479,7 @@ impl ValueDecode for RoomJoinRequest { * ROOM LEAVE * *============*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct RoomLeaveRequest { pub room_name: String, } @@ -452,7 +510,7 @@ impl ValueDecode for RoomLeaveRequest { * ROOM MESSAGE * *==============*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct RoomMessageRequest { pub room_name: String, pub message: String, @@ -485,7 +543,7 @@ impl ValueDecode for RoomMessageRequest { * SET LISTEN PORT * *=================*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct SetListenPortRequest { pub port: u16, } @@ -514,7 +572,7 @@ impl ValueDecode for SetListenPortRequest { * USER STATUS * *=============*/ -#[derive(Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct UserStatusRequest { 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] fn roundtrip_cannot_connect_request() { 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] fn roundtrip_connect_to_peer_request() { 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] fn roundtrip_file_search_request() { 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] fn roundtrip_login_request() { 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] fn roundtrip_peer_address_request() { 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] fn roundtrip_room_join_request() { 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] fn roundtrip_room_leave_request() { 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) } + #[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] fn roundtrip_room_message_request() { 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] fn roundtrip_set_listen_port_request() { 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] fn roundtrip_user_status_request() { roundtrip(ServerRequest::UserStatusRequest(UserStatusRequest { diff --git a/tests/connect.rs b/tests/connect.rs index 399810d..59913e7 100644 --- a/tests/connect.rs +++ b/tests/connect.rs @@ -66,9 +66,12 @@ async fn integration_check_user_status() { let mut inbound = client.run(outbound); request_tx - .send(ServerRequest::UserStatusRequest(UserStatusRequest { - user_name: user_name.clone(), - })) + .send( + UserStatusRequest { + user_name: user_name.clone(), + } + .into(), + ) .await .unwrap();