use crate::messages::{self as msg, Message, MessageIdentity};
use std::io::{Error, ErrorKind};
#[derive(Debug)]
pub enum MessageType {
Error(msg::MsgError),
Empty(msg::MsgEmpty),
Use(msg::MsgUse),
Velocity(msg::MsgVelocity),
Angle(msg::MsgAngle),
ComponentStatusQuery(msg::MsgComponentStatusQuery),
RComponentStatus(msg::RMsgComponentStatus),
State(msg::MsgState),
RState(msg::RMsgState),
ModuleStatusQuery(msg::MsgModuleStatusQuery),
RModuleStatus(msg::RMsgModuleStatus),
Teleport(msg::MsgTeleport),
Radar(msg::MsgRadar),
RRadar(msg::RMsgRadar),
Laser(msg::MsgLaser),
RLaser(msg::RMsgLaser),
ForceField(msg::MsgForceField),
Mine(msg::MsgMine),
Time(msg::MsgTime),
RTime(msg::RMsgTime),
Repair(msg::MsgRepair),
RRepair(msg::RMsgRepair),
Thrust(msg::MsgThrust),
Scan(msg::MsgScan),
RScanObject(msg::RMsgScanObject),
RScan(msg::RMsgScan),
GPS(msg::MsgGPS),
RGPS(msg::RMsgGPS),
}
macro_rules! id {
($n:expr, $msgType:ty) => {
impl MessageIdentity for $msgType {
fn id() -> i32 {
$n
}
}
impl Message for $msgType {
fn as_any(&self) -> &dyn std::any::Any {
self
}
}
};
}
id!(0, msg::MsgError);
id!(1, msg::MsgEmpty);
id!(2, msg::MsgUse);
id!(3, msg::MsgVelocity);
id!(4, msg::MsgAngle);
id!(5, msg::MsgComponentStatusQuery);
id!(6, msg::RMsgComponentStatus);
id!(7, msg::MsgState);
id!(8, msg::RMsgState);
id!(9, msg::MsgModuleStatusQuery);
id!(10, msg::RMsgModuleStatus);
id!(11, msg::MsgTeleport);
id!(12, msg::MsgRadar);
id!(13, msg::RMsgRadar);
id!(14, msg::MsgLaser);
id!(15, msg::RMsgLaser);
id!(16, msg::MsgForceField);
id!(17, msg::MsgMine);
id!(18, msg::MsgTime);
id!(19, msg::RMsgTime);
id!(20, msg::MsgRepair);
id!(21, msg::RMsgRepair);
id!(22, msg::MsgThrust);
id!(23, msg::MsgScan);
id!(24, msg::RMsgScanObject);
id!(25, msg::RMsgScan);
id!(26, msg::MsgGPS);
id!(27, msg::RMsgGPS);
macro_rules! dec_msg {
($bytes: expr => $msg: ty) => {
serde_json::from_slice::<$msg>($bytes)?
};
}
pub fn decode_message(bytes: &[u8], typ: i32) -> Result<MessageType, std::io::Error> {
match typ {
0 => Ok(MessageType::Error(dec_msg!(bytes => msg::MsgError))),
1 => Ok(MessageType::Empty(dec_msg!(bytes => msg::MsgEmpty))),
2 => Ok(MessageType::Use(dec_msg!(bytes => msg::MsgUse))),
3 => Ok(MessageType::Velocity(dec_msg!(bytes => msg::MsgVelocity))),
4 => Ok(MessageType::Angle(dec_msg!(bytes => msg::MsgAngle))),
5 => Ok(MessageType::ComponentStatusQuery(
dec_msg!(bytes => msg::MsgComponentStatusQuery),
)),
6 => Ok(MessageType::RComponentStatus(
dec_msg!(bytes => msg::RMsgComponentStatus),
)),
7 => Ok(MessageType::State(dec_msg!(bytes => msg::MsgState))),
8 => Ok(MessageType::RState(dec_msg!(bytes => msg::RMsgState))),
9 => Ok(MessageType::ModuleStatusQuery(
dec_msg!(bytes => msg::MsgModuleStatusQuery),
)),
10 => Ok(MessageType::RModuleStatus(
dec_msg!(bytes => msg::RMsgModuleStatus),
)),
11 => Ok(MessageType::Teleport(dec_msg!(bytes => msg::MsgTeleport))),
12 => Ok(MessageType::Radar(dec_msg!(bytes => msg::MsgRadar))),
13 => Ok(MessageType::RRadar(dec_msg!(bytes => msg::RMsgRadar))),
14 => Ok(MessageType::Laser(dec_msg!(bytes => msg::MsgLaser))),
15 => Ok(MessageType::RLaser(dec_msg!(bytes => msg::RMsgLaser))),
16 => Ok(MessageType::ForceField(
dec_msg!(bytes => msg::MsgForceField),
)),
17 => Ok(MessageType::Mine(dec_msg!(bytes => msg::MsgMine))),
18 => Ok(MessageType::Time(dec_msg!(bytes => msg::MsgTime))),
19 => Ok(MessageType::RTime(dec_msg!(bytes => msg::RMsgTime))),
20 => Ok(MessageType::Repair(dec_msg!(bytes => msg::MsgRepair))),
21 => Ok(MessageType::RRepair(dec_msg!(bytes => msg::RMsgRepair))),
22 => Ok(MessageType::Thrust(dec_msg!(bytes => msg::MsgThrust))),
23 => Ok(MessageType::Scan(dec_msg!(bytes => msg::MsgScan))),
24 => Ok(MessageType::RScanObject(
dec_msg!(bytes => msg::RMsgScanObject),
)),
25 => Ok(MessageType::RScan(dec_msg!(bytes => msg::RMsgScan))),
26 => Ok(MessageType::GPS(dec_msg!(bytes => msg::MsgGPS))),
27 => Ok(MessageType::RGPS(dec_msg!(bytes => msg::RMsgGPS))),
_ => Err(Error::new(ErrorKind::InvalidData, "Unexpected type.")),
}
}