wsio_core/packet/codecs/
mod.rs1use anyhow::Result;
2use serde::{
3 Serialize,
4 de::DeserializeOwned,
5};
6
7#[cfg(feature = "packet-codec-bincode")]
8mod bincode;
9
10#[cfg(feature = "packet-codec-cbor")]
11mod cbor;
12
13#[cfg(feature = "packet-codec-msgpack")]
14mod msgpack;
15
16#[cfg(feature = "packet-codec-postcard")]
17mod postcard;
18
19mod serde_json;
20
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-cbor")]
27use self::cbor::WsIoPacketCborCodec;
28#[cfg(feature = "packet-codec-msgpack")]
29use self::msgpack::WsIoPacketMsgPackCodec;
30#[cfg(feature = "packet-codec-postcard")]
31use self::postcard::WsIoPacketPostcardCodec;
32use self::serde_json::WsIoPacketSerdeJsonCodec;
33#[cfg(feature = "packet-codec-sonic-rs")]
34use self::sonic_rs::WsIoPacketSonicRsCodec;
35use super::WsIoPacket;
36
37#[derive(Clone, Copy, Debug)]
38pub enum WsIoPacketCodec {
39 #[cfg(feature = "packet-codec-bincode")]
40 Bincode,
41
42 #[cfg(feature = "packet-codec-cbor")]
43 Cbor,
44
45 #[cfg(feature = "packet-codec-msgpack")]
46 MsgPack,
47
48 #[cfg(feature = "packet-codec-postcard")]
49 Postcard,
50
51 SerdeJson,
52
53 #[cfg(feature = "packet-codec-sonic-rs")]
54 SonicRs,
55}
56
57impl WsIoPacketCodec {
58 #[inline]
59 pub fn decode(&self, bytes: &[u8]) -> Result<WsIoPacket> {
60 match self {
61 #[cfg(feature = "packet-codec-bincode")]
62 Self::Bincode => WsIoPacketBincodeCodec.decode(bytes),
63
64 #[cfg(feature = "packet-codec-cbor")]
65 Self::Cbor => WsIoPacketCborCodec.decode(bytes),
66
67 #[cfg(feature = "packet-codec-msgpack")]
68 Self::MsgPack => WsIoPacketMsgPackCodec.decode(bytes),
69
70 #[cfg(feature = "packet-codec-postcard")]
71 Self::Postcard => WsIoPacketPostcardCodec.decode(bytes),
72
73 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode(bytes),
74
75 #[cfg(feature = "packet-codec-sonic-rs")]
76 Self::SonicRs => WsIoPacketSonicRsCodec.decode(bytes),
77 }
78 }
79
80 #[inline]
81 pub fn decode_data<D: DeserializeOwned>(&self, bytes: &[u8]) -> Result<D> {
82 match self {
83 #[cfg(feature = "packet-codec-bincode")]
84 Self::Bincode => WsIoPacketBincodeCodec.decode_data(bytes),
85
86 #[cfg(feature = "packet-codec-cbor")]
87 Self::Cbor => WsIoPacketCborCodec.decode_data(bytes),
88
89 #[cfg(feature = "packet-codec-msgpack")]
90 Self::MsgPack => WsIoPacketMsgPackCodec.decode_data(bytes),
91
92 #[cfg(feature = "packet-codec-postcard")]
93 Self::Postcard => WsIoPacketPostcardCodec.decode_data(bytes),
94
95 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode_data(bytes),
96
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
108 #[cfg(feature = "packet-codec-cbor")]
109 Self::Cbor => WsIoPacketCborCodec.encode(packet),
110
111 #[cfg(feature = "packet-codec-msgpack")]
112 Self::MsgPack => WsIoPacketMsgPackCodec.encode(packet.clone()),
113
114 #[cfg(feature = "packet-codec-postcard")]
115 Self::Postcard => WsIoPacketPostcardCodec.encode(packet.clone()),
116
117 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode(packet),
118
119 #[cfg(feature = "packet-codec-sonic-rs")]
120 Self::SonicRs => WsIoPacketSonicRsCodec.encode(packet),
121 }
122 }
123
124 #[inline]
125 pub fn encode_data<D: Serialize>(&self, data: &D) -> Result<Vec<u8>> {
126 match self {
127 #[cfg(feature = "packet-codec-bincode")]
128 Self::Bincode => WsIoPacketBincodeCodec.encode_data(data),
129
130 #[cfg(feature = "packet-codec-cbor")]
131 Self::Cbor => WsIoPacketCborCodec.encode_data(data),
132
133 #[cfg(feature = "packet-codec-msgpack")]
134 Self::MsgPack => WsIoPacketMsgPackCodec.encode_data(data),
135
136 #[cfg(feature = "packet-codec-postcard")]
137 Self::Postcard => WsIoPacketPostcardCodec.encode_data(data),
138
139 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode_data(data),
140
141 #[cfg(feature = "packet-codec-sonic-rs")]
142 Self::SonicRs => WsIoPacketSonicRsCodec.encode_data(data),
143 }
144 }
145
146 #[inline]
147 pub fn is_text(&self) -> bool {
148 match self {
149 #[cfg(feature = "packet-codec-bincode")]
150 Self::Bincode => WsIoPacketBincodeCodec::IS_TEXT,
151
152 #[cfg(feature = "packet-codec-cbor")]
153 Self::Cbor => WsIoPacketCborCodec::IS_TEXT,
154
155 #[cfg(feature = "packet-codec-msgpack")]
156 Self::MsgPack => WsIoPacketMsgPackCodec::IS_TEXT,
157
158 #[cfg(feature = "packet-codec-postcard")]
159 Self::Postcard => WsIoPacketPostcardCodec::IS_TEXT,
160
161 Self::SerdeJson => WsIoPacketSerdeJsonCodec::IS_TEXT,
162
163 #[cfg(feature = "packet-codec-sonic-rs")]
164 Self::SonicRs => WsIoPacketSonicRsCodec::IS_TEXT,
165 }
166 }
167}