wsio_core/packet/codecs/
mod.rs

1use anyhow::Result;
2use serde::{
3    Serialize,
4    de::DeserializeOwned,
5};
6
7#[cfg(feature = "packet-codec-bincode")]
8mod bincode;
9#[cfg(feature = "packet-codec-msgpack")]
10mod msgpack;
11mod serde_json;
12#[cfg(feature = "packet-codec-sonic-rs")]
13mod sonic_rs;
14
15#[cfg(feature = "packet-codec-bincode")]
16use self::bincode::WsIoPacketBincodeCodec;
17#[cfg(feature = "packet-codec-msgpack")]
18use self::msgpack::WsIoPacketMsgPackCodec;
19use self::serde_json::WsIoPacketSerdeJsonCodec;
20#[cfg(feature = "packet-codec-sonic-rs")]
21use self::sonic_rs::WsIoPacketSonicRsCodec;
22use super::WsIoPacket;
23
24#[derive(Clone, Copy, Debug)]
25pub enum WsIoPacketCodec {
26    #[cfg(feature = "packet-codec-bincode")]
27    Bincode,
28    #[cfg(feature = "packet-codec-msgpack")]
29    MsgPack,
30    SerdeJson,
31    #[cfg(feature = "packet-codec-sonic-rs")]
32    SonicRs,
33}
34
35impl WsIoPacketCodec {
36    #[inline]
37    pub fn decode(&self, bytes: &[u8]) -> Result<WsIoPacket> {
38        match self {
39            #[cfg(feature = "packet-codec-bincode")]
40            Self::Bincode => WsIoPacketBincodeCodec.decode(bytes),
41            #[cfg(feature = "packet-codec-msgpack")]
42            Self::MsgPack => WsIoPacketMsgPackCodec.decode(bytes),
43            Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode(bytes),
44            #[cfg(feature = "packet-codec-sonic-rs")]
45            Self::SonicRs => WsIoPacketSonicRsCodec.decode(bytes),
46        }
47    }
48
49    #[inline]
50    pub fn decode_data<D: DeserializeOwned>(&self, bytes: &[u8]) -> Result<D> {
51        match self {
52            #[cfg(feature = "packet-codec-bincode")]
53            Self::Bincode => WsIoPacketBincodeCodec.decode_data(bytes),
54            #[cfg(feature = "packet-codec-msgpack")]
55            Self::MsgPack => WsIoPacketMsgPackCodec.decode_data(bytes),
56            Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode_data(bytes),
57            #[cfg(feature = "packet-codec-sonic-rs")]
58            Self::SonicRs => WsIoPacketSonicRsCodec.decode_data(bytes),
59        }
60    }
61
62    #[inline]
63    pub fn encode(&self, packet: &WsIoPacket) -> Result<Vec<u8>> {
64        match self {
65            #[cfg(feature = "packet-codec-bincode")]
66            Self::Bincode => WsIoPacketBincodeCodec.encode(packet.clone()),
67            #[cfg(feature = "packet-codec-msgpack")]
68            Self::MsgPack => WsIoPacketMsgPackCodec.encode(packet.clone()),
69            Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode(packet),
70            #[cfg(feature = "packet-codec-sonic-rs")]
71            Self::SonicRs => WsIoPacketSonicRsCodec.encode(packet),
72        }
73    }
74
75    #[inline]
76    pub fn empty_data_encoded(&self) -> &[u8] {
77        match self {
78            #[cfg(feature = "packet-codec-bincode")]
79            Self::Bincode => WsIoPacketBincodeCodec.empty_data_encoded(),
80            #[cfg(feature = "packet-codec-msgpack")]
81            Self::MsgPack => WsIoPacketMsgPackCodec.empty_data_encoded(),
82            Self::SerdeJson => WsIoPacketSerdeJsonCodec.empty_data_encoded(),
83            #[cfg(feature = "packet-codec-sonic-rs")]
84            Self::SonicRs => WsIoPacketSonicRsCodec.empty_data_encoded(),
85        }
86    }
87
88    #[inline]
89    pub fn encode_data<D: Serialize>(&self, data: &D) -> Result<Vec<u8>> {
90        match self {
91            #[cfg(feature = "packet-codec-bincode")]
92            Self::Bincode => WsIoPacketBincodeCodec.encode_data(data),
93            #[cfg(feature = "packet-codec-msgpack")]
94            Self::MsgPack => WsIoPacketMsgPackCodec.encode_data(data),
95            Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode_data(data),
96            #[cfg(feature = "packet-codec-sonic-rs")]
97            Self::SonicRs => WsIoPacketSonicRsCodec.encode_data(data),
98        }
99    }
100
101    pub fn is_text(&self) -> bool {
102        match self {
103            #[cfg(feature = "packet-codec-bincode")]
104            Self::Bincode => WsIoPacketBincodeCodec::IS_TEXT,
105            #[cfg(feature = "packet-codec-msgpack")]
106            Self::MsgPack => WsIoPacketMsgPackCodec::IS_TEXT,
107            Self::SerdeJson => WsIoPacketSerdeJsonCodec::IS_TEXT,
108            #[cfg(feature = "packet-codec-sonic-rs")]
109            Self::SonicRs => WsIoPacketSonicRsCodec::IS_TEXT,
110        }
111    }
112}