54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
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<Self::Result> {
|
|
if let ServerMsg::$resp(res) = msg {
|
|
Some(res)
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
}
|
|
)?
|
|
)*
|
|
};
|
|
}
|
|
use msg_type;
|