wsio_core/packet/codecs/
mod.rs1use 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}