use super::{RequestMsg, data::*}; msg_type!(ClientMsg: { 0: CreateAccount => CreateAccountResp, 1: Login => LoginResp, 2: RequestUsers => RequestUsersResp, 3: RequestFriends => RequestFriendsResp, 4: AddFriend => AddFriendResp, 5: RemoveFriend, 6: AnswerFriendRequest, 7: GenerateToken => GenerateTokenResp, }); msg_type!(ServerMsg: { 0: NotLoggedIn, 1: NoPermission, 2: AccountDeleted, 3: CreateAccountResp, 4: LoginResp, 5: RequestUsersResp, 6: RequestFriendsResp, 7: AddFriendResp, 8: GenerateTokenResp, }); macro_rules! msg_type { ($msg:ident: {$($num:literal: $name:ident $(=> $resp:ident)?,)*}) => { #[repr(u32)] #[derive(Debug, bitcode::Encode, bitcode::Decode)] pub enum $msg {$( $name($name) = $num, )*} $( impl From<$name> for $msg { fn from(value: $name) -> Self { Self::$name(value) } } $( impl RequestMsg for $name { type Result = $resp; fn result(msg: ServerMsg) -> Option { if let ServerMsg::$resp(res) = msg { Some(res) } else { None } } } )? )* }; } use msg_type;