aboutsummaryrefslogtreecommitdiff
path: root/src/message/handshake/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/message/handshake/mod.rs')
-rw-r--r--src/message/handshake/mod.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/message/handshake/mod.rs b/src/message/handshake/mod.rs
index 9b3bcee..9885012 100644
--- a/src/message/handshake/mod.rs
+++ b/src/message/handshake/mod.rs
@@ -21,3 +21,49 @@ pub use init::*;
pub use protocol::*;
pub use sessioninit::*;
pub use types::*;
+
+use crate::primitive::{Variant, VariantMap};
+use crate::{HandshakeDeserialize, HandshakeSerialize};
+
+#[derive(Debug, Clone)]
+pub enum HandshakeMessage {
+ ClientInit(ClientInit),
+ ClientInitAck(ClientInitAck),
+ ClientInitReject(ClientInitReject),
+ ClientLogin(ClientLogin),
+ ClientLoginAck,
+ ClientLoginReject(ClientLoginReject),
+ SessionInit(SessionInit),
+}
+
+impl HandshakeSerialize for HandshakeMessage {
+ fn serialize(&self) -> Result<Vec<u8>, failure::Error> {
+ match self {
+ HandshakeMessage::ClientInit(inner) => inner.serialize(),
+ HandshakeMessage::ClientInitAck(inner) => inner.serialize(),
+ HandshakeMessage::ClientInitReject(inner) => inner.serialize(),
+ HandshakeMessage::ClientLogin(inner) => inner.serialize(),
+ HandshakeMessage::ClientLoginAck => ClientLoginAck.serialize(),
+ HandshakeMessage::ClientLoginReject(inner) => inner.serialize(),
+ HandshakeMessage::SessionInit(inner) => inner.serialize(),
+ }
+ }
+}
+
+impl HandshakeDeserialize for HandshakeMessage {
+ fn parse(b: &[u8]) -> Result<(usize, Self), failure::Error> {
+ let (size, res) = VariantMap::parse(b)?;
+
+ let msgtype = match_variant!(&res["MsgType"], Variant::String);
+ match msgtype.as_str() {
+ "ClientInit" => Ok((size, HandshakeMessage::ClientInit(res.into()))),
+ "ClientInitAck" => Ok((size, HandshakeMessage::ClientInitAck(res.into()))),
+ "ClientInitReject" => Ok((size, HandshakeMessage::ClientInitReject(res.into()))),
+ "ClientLogin" => Ok((size, HandshakeMessage::ClientLogin(res.into()))),
+ "ClientLoginAck" => Ok((size, HandshakeMessage::ClientLoginAck)),
+ "ClientLoginReject" => Ok((size, HandshakeMessage::ClientLoginReject(res.into()))),
+ "SessionInit" => Ok((size, HandshakeMessage::SessionInit(res.into()))),
+ _ => unimplemented!(),
+ }
+ }
+}