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)]
39pub enum WsIoPacketCodec {
40 #[cfg(feature = "packet-codec-bincode")]
41 Bincode,
42
43 #[cfg(feature = "packet-codec-cbor")]
44 Cbor,
45
46 #[cfg(feature = "packet-codec-msgpack")]
47 MsgPack,
48
49 #[cfg(feature = "packet-codec-postcard")]
50 Postcard,
51
52 SerdeJson,
53
54 #[cfg(feature = "packet-codec-sonic-rs")]
55 SonicRs,
56}
57
58impl WsIoPacketCodec {
59 #[inline]
60 pub fn decode(&self, bytes: &[u8]) -> Result<WsIoPacket> {
61 match self {
62 #[cfg(feature = "packet-codec-bincode")]
63 Self::Bincode => WsIoPacketBincodeCodec.decode(bytes),
64
65 #[cfg(feature = "packet-codec-cbor")]
66 Self::Cbor => WsIoPacketCborCodec.decode(bytes),
67
68 #[cfg(feature = "packet-codec-msgpack")]
69 Self::MsgPack => WsIoPacketMsgPackCodec.decode(bytes),
70
71 #[cfg(feature = "packet-codec-postcard")]
72 Self::Postcard => WsIoPacketPostcardCodec.decode(bytes),
73
74 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode(bytes),
75
76 #[cfg(feature = "packet-codec-sonic-rs")]
77 Self::SonicRs => WsIoPacketSonicRsCodec.decode(bytes),
78 }
79 }
80
81 #[inline]
82 pub fn decode_data<D: DeserializeOwned>(&self, bytes: &[u8]) -> Result<D> {
83 match self {
84 #[cfg(feature = "packet-codec-bincode")]
85 Self::Bincode => WsIoPacketBincodeCodec.decode_data(bytes),
86
87 #[cfg(feature = "packet-codec-cbor")]
88 Self::Cbor => WsIoPacketCborCodec.decode_data(bytes),
89
90 #[cfg(feature = "packet-codec-msgpack")]
91 Self::MsgPack => WsIoPacketMsgPackCodec.decode_data(bytes),
92
93 #[cfg(feature = "packet-codec-postcard")]
94 Self::Postcard => WsIoPacketPostcardCodec.decode_data(bytes),
95
96 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode_data(bytes),
97
98 #[cfg(feature = "packet-codec-sonic-rs")]
99 Self::SonicRs => WsIoPacketSonicRsCodec.decode_data(bytes),
100 }
101 }
102
103 #[inline]
104 pub fn encode(&self, packet: &WsIoPacket) -> Result<Vec<u8>> {
105 match self {
106 #[cfg(feature = "packet-codec-bincode")]
107 Self::Bincode => WsIoPacketBincodeCodec.encode(packet),
108
109 #[cfg(feature = "packet-codec-cbor")]
110 Self::Cbor => WsIoPacketCborCodec.encode(packet),
111
112 #[cfg(feature = "packet-codec-msgpack")]
113 Self::MsgPack => WsIoPacketMsgPackCodec.encode(packet),
114
115 #[cfg(feature = "packet-codec-postcard")]
116 Self::Postcard => WsIoPacketPostcardCodec.encode(packet),
117
118 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode(packet),
119
120 #[cfg(feature = "packet-codec-sonic-rs")]
121 Self::SonicRs => WsIoPacketSonicRsCodec.encode(packet),
122 }
123 }
124
125 #[inline]
126 pub fn encode_data<D: Serialize>(&self, data: &D) -> Result<Vec<u8>> {
127 match self {
128 #[cfg(feature = "packet-codec-bincode")]
129 Self::Bincode => WsIoPacketBincodeCodec.encode_data(data),
130
131 #[cfg(feature = "packet-codec-cbor")]
132 Self::Cbor => WsIoPacketCborCodec.encode_data(data),
133
134 #[cfg(feature = "packet-codec-msgpack")]
135 Self::MsgPack => WsIoPacketMsgPackCodec.encode_data(data),
136
137 #[cfg(feature = "packet-codec-postcard")]
138 Self::Postcard => WsIoPacketPostcardCodec.encode_data(data),
139
140 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode_data(data),
141
142 #[cfg(feature = "packet-codec-sonic-rs")]
143 Self::SonicRs => WsIoPacketSonicRsCodec.encode_data(data),
144 }
145 }
146
147 #[inline]
148 pub fn is_text(&self) -> bool {
149 match self {
150 #[cfg(feature = "packet-codec-bincode")]
151 Self::Bincode => WsIoPacketBincodeCodec::IS_TEXT,
152
153 #[cfg(feature = "packet-codec-cbor")]
154 Self::Cbor => WsIoPacketCborCodec::IS_TEXT,
155
156 #[cfg(feature = "packet-codec-msgpack")]
157 Self::MsgPack => WsIoPacketMsgPackCodec::IS_TEXT,
158
159 #[cfg(feature = "packet-codec-postcard")]
160 Self::Postcard => WsIoPacketPostcardCodec::IS_TEXT,
161
162 Self::SerdeJson => WsIoPacketSerdeJsonCodec::IS_TEXT,
163
164 #[cfg(feature = "packet-codec-sonic-rs")]
165 Self::SonicRs => WsIoPacketSonicRsCodec::IS_TEXT,
166 }
167 }
168}