wsio_core/packet/codecs/
mod.rs

1use std::{
2    fmt::{
3        Display,
4        Formatter,
5        Result as FmtResult,
6    },
7    str::FromStr,
8};
9
10use anyhow::Result;
11use serde::{
12    Serialize,
13    de::DeserializeOwned,
14};
15
16#[cfg(feature = "packet-codec-bincode")]
17mod bincode;
18#[cfg(feature = "packet-codec-msgpack")]
19mod msgpack;
20mod serde_json;
21#[cfg(feature = "packet-codec-sonic-rs")]
22mod sonic_rs;
23
24#[cfg(feature = "packet-codec-bincode")]
25use self::bincode::WsIoPacketBincodeCodec;
26#[cfg(feature = "packet-codec-msgpack")]
27use self::msgpack::WsIoPacketMsgPackCodec;
28use self::serde_json::WsIoPacketSerdeJsonCodec;
29#[cfg(feature = "packet-codec-sonic-rs")]
30use self::sonic_rs::WsIoPacketSonicRsCodec;
31use super::WsIoPacket;
32
33#[derive(Clone, Copy, Debug)]
34pub enum WsIoPacketCodec {
35    #[cfg(feature = "packet-codec-bincode")]
36    Bincode,
37    #[cfg(feature = "packet-codec-msgpack")]
38    MsgPack,
39    SerdeJson,
40    #[cfg(feature = "packet-codec-sonic-rs")]
41    SonicRs,
42}
43
44impl Display for WsIoPacketCodec {
45    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
46        match self {
47            #[cfg(feature = "packet-codec-bincode")]
48            WsIoPacketCodec::Bincode => write!(f, "1"),
49            #[cfg(feature = "packet-codec-msgpack")]
50            WsIoPacketCodec::MsgPack => write!(f, "2"),
51            WsIoPacketCodec::SerdeJson => write!(f, "3"),
52            #[cfg(feature = "packet-codec-sonic-rs")]
53            WsIoPacketCodec::SonicRs => write!(f, "4"),
54        }
55    }
56}
57
58impl FromStr for WsIoPacketCodec {
59    type Err = &'static str;
60
61    fn from_str(s: &str) -> Result<Self, Self::Err> {
62        match s {
63            #[cfg(feature = "packet-codec-bincode")]
64            "1" => Ok(WsIoPacketCodec::Bincode),
65            #[cfg(feature = "packet-codec-msgpack")]
66            "2" => Ok(WsIoPacketCodec::MsgPack),
67            "3" => Ok(WsIoPacketCodec::SerdeJson),
68            #[cfg(feature = "packet-codec-sonic-rs")]
69            "4" => Ok(WsIoPacketCodec::SonicRs),
70            _ => Err("Invalid WsIoPacketCodec code"),
71        }
72    }
73}
74
75impl WsIoPacketCodec {
76    #[inline]
77    pub fn decode(&self, bytes: &[u8]) -> Result<WsIoPacket> {
78        match self {
79            #[cfg(feature = "packet-codec-bincode")]
80            Self::Bincode => WsIoPacketBincodeCodec.decode(bytes),
81            #[cfg(feature = "packet-codec-msgpack")]
82            Self::MsgPack => WsIoPacketMsgPackCodec.decode(bytes),
83            Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode(bytes),
84            #[cfg(feature = "packet-codec-sonic-rs")]
85            Self::SonicRs => WsIoPacketSonicRsCodec.decode(bytes),
86        }
87    }
88
89    #[inline]
90    pub fn decode_data<D: DeserializeOwned>(&self, bytes: &[u8]) -> Result<D> {
91        match self {
92            #[cfg(feature = "packet-codec-bincode")]
93            Self::Bincode => WsIoPacketBincodeCodec.decode_data(bytes),
94            #[cfg(feature = "packet-codec-msgpack")]
95            Self::MsgPack => WsIoPacketMsgPackCodec.decode_data(bytes),
96            Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode_data(bytes),
97            #[cfg(feature = "packet-codec-sonic-rs")]
98            Self::SonicRs => WsIoPacketSonicRsCodec.decode_data(bytes),
99        }
100    }
101
102    #[inline]
103    pub fn encode(&self, packet: &WsIoPacket) -> Result<Vec<u8>> {
104        match self {
105            #[cfg(feature = "packet-codec-bincode")]
106            Self::Bincode => WsIoPacketBincodeCodec.encode(packet.clone()),
107            #[cfg(feature = "packet-codec-msgpack")]
108            Self::MsgPack => WsIoPacketMsgPackCodec.encode(packet.clone()),
109            Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode(packet),
110            #[cfg(feature = "packet-codec-sonic-rs")]
111            Self::SonicRs => WsIoPacketSonicRsCodec.encode(packet),
112        }
113    }
114
115    #[inline]
116    pub fn empty_data_encoded(&self) -> &[u8] {
117        match self {
118            #[cfg(feature = "packet-codec-bincode")]
119            Self::Bincode => WsIoPacketBincodeCodec.empty_data_encoded(),
120            #[cfg(feature = "packet-codec-msgpack")]
121            Self::MsgPack => WsIoPacketMsgPackCodec.empty_data_encoded(),
122            Self::SerdeJson => WsIoPacketSerdeJsonCodec.empty_data_encoded(),
123            #[cfg(feature = "packet-codec-sonic-rs")]
124            Self::SonicRs => WsIoPacketSonicRsCodec.empty_data_encoded(),
125        }
126    }
127
128    #[inline]
129    pub fn encode_data<D: Serialize>(&self, data: &D) -> Result<Vec<u8>> {
130        match self {
131            #[cfg(feature = "packet-codec-bincode")]
132            Self::Bincode => WsIoPacketBincodeCodec.encode_data(data),
133            #[cfg(feature = "packet-codec-msgpack")]
134            Self::MsgPack => WsIoPacketMsgPackCodec.encode_data(data),
135            Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode_data(data),
136            #[cfg(feature = "packet-codec-sonic-rs")]
137            Self::SonicRs => WsIoPacketSonicRsCodec.encode_data(data),
138        }
139    }
140
141    pub fn is_text(&self) -> bool {
142        match self {
143            #[cfg(feature = "packet-codec-bincode")]
144            Self::Bincode => WsIoPacketBincodeCodec::IS_TEXT,
145            #[cfg(feature = "packet-codec-msgpack")]
146            Self::MsgPack => WsIoPacketMsgPackCodec::IS_TEXT,
147            Self::SerdeJson => WsIoPacketSerdeJsonCodec::IS_TEXT,
148            #[cfg(feature = "packet-codec-sonic-rs")]
149            Self::SonicRs => WsIoPacketSonicRsCodec::IS_TEXT,
150        }
151    }
152}