1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// DO NOT EDIT THIS FILE MANUALLY
// IT IS AUTOMATICALLY GENERATED
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.")),
    }
}