diff --git a/proto/src/server/constants.rs b/proto/src/server/constants.rs index 17e1430..80bb64f 100644 --- a/proto/src/server/constants.rs +++ b/proto/src/server/constants.rs @@ -16,4 +16,5 @@ pub const CODE_PARENT_MIN_SPEED: u32 = 83; pub const CODE_PARENT_SPEED_RATIO: u32 = 84; pub const CODE_WISHLIST_INTERVAL: u32 = 104; pub const CODE_ROOM_TICKERS: u32 = 113; +pub const CODE_EXCLUDED_SEARCH_PHRASES: u32 = 160; pub const CODE_CANNOT_CONNECT: u32 = 1001; diff --git a/proto/src/server/response.rs b/proto/src/server/response.rs index cec294e..bf73ae1 100644 --- a/proto/src/server/response.rs +++ b/proto/src/server/response.rs @@ -17,6 +17,7 @@ use crate::{User, UserStatus}; #[derive(Clone, Debug, Eq, PartialEq)] pub enum ServerResponse { ConnectToPeerResponse(ConnectToPeerResponse), + ExcludedSearchPhrasesResponse(ExcludedSearchPhrasesResponse), FileSearchResponse(FileSearchResponse), LoginResponse(LoginResponse), PeerAddressResponse(PeerAddressResponse), @@ -49,6 +50,10 @@ impl ValueEncode for ServerResponse { encoder.encode_u32(CODE_CONNECT_TO_PEER)?; response.encode_to(encoder)?; } + ServerResponse::ExcludedSearchPhrasesResponse(ref response) => { + encoder.encode_u32(CODE_EXCLUDED_SEARCH_PHRASES)?; + response.encode_to(encoder)?; + } ServerResponse::FileSearchResponse(ref response) => { encoder.encode_u32(CODE_FILE_SEARCH)?; response.encode_to(encoder)?; @@ -130,6 +135,10 @@ impl ValueDecode for ServerResponse { let response = decoder.decode()?; ServerResponse::ConnectToPeerResponse(response) } + CODE_EXCLUDED_SEARCH_PHRASES => { + let response = decoder.decode()?; + ServerResponse::ExcludedSearchPhrasesResponse(response) + } CODE_FILE_SEARCH => { let response = decoder.decode()?; ServerResponse::FileSearchResponse(response) @@ -260,6 +269,38 @@ impl ValueDecode for ConnectToPeerResponse { } } +/*=========================* + * EXCLUDED SEARCH PHRASES * + *=========================*/ + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct ExcludedSearchPhrasesResponse { + pub phrases: Vec, +} + +impl From for ServerResponse { + fn from(response: ExcludedSearchPhrasesResponse) -> Self { + Self::ExcludedSearchPhrasesResponse(response) + } +} + +impl ValueEncode for ExcludedSearchPhrasesResponse { + fn encode_to( + &self, + encoder: &mut ValueEncoder, + ) -> Result<(), ValueEncodeError> { + encoder.encode(&self.phrases) + } +} + +impl ValueDecode for ExcludedSearchPhrasesResponse { + fn decode_from(decoder: &mut ValueDecoder) -> Result { + let phrases = decoder.decode()?; + + Ok(ExcludedSearchPhrasesResponse { phrases }) + } +} + /*=============* * FILE SEARCH * *=============*/ @@ -1155,6 +1196,15 @@ mod tests { )) } + #[test] + fn roundtrip_excluded_search_phrases() { + roundtrip(ServerResponse::ExcludedSearchPhrasesResponse( + ExcludedSearchPhrasesResponse { + phrases: vec!["yo".to_string(), "lo".to_string()], + }, + )) + } + #[test] fn roundtrip_file_search() { roundtrip(ServerResponse::FileSearchResponse(FileSearchResponse {