Files
openworm/src/net/msg.rs
2026-02-18 21:52:22 -05:00

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;