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#[cfg(feature = "packet-codec-cbor")]
10mod cbor;
11#[cfg(feature = "packet-codec-msgpack")]
12mod msgpack;
13mod serde_json;
14#[cfg(feature = "packet-codec-sonic-rs")]
15mod sonic_rs;
16
17#[cfg(feature = "packet-codec-bincode")]
18use self::bincode::WsIoPacketBincodeCodec;
19#[cfg(feature = "packet-codec-cbor")]
20use self::cbor::WsIoPacketCborCodec;
21#[cfg(feature = "packet-codec-msgpack")]
22use self::msgpack::WsIoPacketMsgPackCodec;
23use self::serde_json::WsIoPacketSerdeJsonCodec;
24#[cfg(feature = "packet-codec-sonic-rs")]
25use self::sonic_rs::WsIoPacketSonicRsCodec;
26use super::WsIoPacket;
27
28#[derive(Clone, Copy, Debug)]
29pub enum WsIoPacketCodec {
30 #[cfg(feature = "packet-codec-bincode")]
31 Bincode,
32
33 #[cfg(feature = "packet-codec-cbor")]
34 Cbor,
35
36 #[cfg(feature = "packet-codec-msgpack")]
37 MsgPack,
38
39 SerdeJson,
40
41 #[cfg(feature = "packet-codec-sonic-rs")]
42 SonicRs,
43}
44
45impl WsIoPacketCodec {
46 #[inline]
47 pub fn decode(&self, bytes: &[u8]) -> Result<WsIoPacket> {
48 match self {
49 #[cfg(feature = "packet-codec-bincode")]
50 Self::Bincode => WsIoPacketBincodeCodec.decode(bytes),
51
52 #[cfg(feature = "packet-codec-cbor")]
53 Self::Cbor => WsIoPacketCborCodec.decode(bytes),
54
55 #[cfg(feature = "packet-codec-msgpack")]
56 Self::MsgPack => WsIoPacketMsgPackCodec.decode(bytes),
57
58 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode(bytes),
59
60 #[cfg(feature = "packet-codec-sonic-rs")]
61 Self::SonicRs => WsIoPacketSonicRsCodec.decode(bytes),
62 }
63 }
64
65 #[inline]
66 pub fn decode_data<D: DeserializeOwned>(&self, bytes: &[u8]) -> Result<D> {
67 match self {
68 #[cfg(feature = "packet-codec-bincode")]
69 Self::Bincode => WsIoPacketBincodeCodec.decode_data(bytes),
70
71 #[cfg(feature = "packet-codec-cbor")]
72 Self::Cbor => WsIoPacketCborCodec.decode_data(bytes),
73
74 #[cfg(feature = "packet-codec-msgpack")]
75 Self::MsgPack => WsIoPacketMsgPackCodec.decode_data(bytes),
76
77 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode_data(bytes),
78
79 #[cfg(feature = "packet-codec-sonic-rs")]
80 Self::SonicRs => WsIoPacketSonicRsCodec.decode_data(bytes),
81 }
82 }
83
84 #[inline]
85 pub fn encode(&self, packet: &WsIoPacket) -> Result<Vec<u8>> {
86 match self {
87 #[cfg(feature = "packet-codec-bincode")]
88 Self::Bincode => WsIoPacketBincodeCodec.encode(packet.clone()),
89
90 #[cfg(feature = "packet-codec-cbor")]
91 Self::Cbor => WsIoPacketCborCodec.encode(packet),
92
93 #[cfg(feature = "packet-codec-msgpack")]
94 Self::MsgPack => WsIoPacketMsgPackCodec.encode(packet.clone()),
95
96 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode(packet),
97
98 #[cfg(feature = "packet-codec-sonic-rs")]
99 Self::SonicRs => WsIoPacketSonicRsCodec.encode(packet),
100 }
101 }
102
103 #[inline]
104 pub fn empty_data_encoded(&self) -> &[u8] {
105 match self {
106 #[cfg(feature = "packet-codec-bincode")]
107 Self::Bincode => WsIoPacketBincodeCodec.empty_data_encoded(),
108
109 #[cfg(feature = "packet-codec-cbor")]
110 Self::Cbor => WsIoPacketCborCodec.empty_data_encoded(),
111
112 #[cfg(feature = "packet-codec-msgpack")]
113 Self::MsgPack => WsIoPacketMsgPackCodec.empty_data_encoded(),
114
115 Self::SerdeJson => WsIoPacketSerdeJsonCodec.empty_data_encoded(),
116
117 #[cfg(feature = "packet-codec-sonic-rs")]
118 Self::SonicRs => WsIoPacketSonicRsCodec.empty_data_encoded(),
119 }
120 }
121
122 #[inline]
123 pub fn encode_data<D: Serialize>(&self, data: &D) -> Result<Vec<u8>> {
124 match self {
125 #[cfg(feature = "packet-codec-bincode")]
126 Self::Bincode => WsIoPacketBincodeCodec.encode_data(data),
127
128 #[cfg(feature = "packet-codec-cbor")]
129 Self::Cbor => WsIoPacketCborCodec.encode_data(data),
130
131 #[cfg(feature = "packet-codec-msgpack")]
132 Self::MsgPack => WsIoPacketMsgPackCodec.encode_data(data),
133
134 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode_data(data),
135
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
146 #[cfg(feature = "packet-codec-cbor")]
147 Self::Cbor => WsIoPacketCborCodec::IS_TEXT,
148
149 #[cfg(feature = "packet-codec-msgpack")]
150 Self::MsgPack => WsIoPacketMsgPackCodec::IS_TEXT,
151
152 Self::SerdeJson => WsIoPacketSerdeJsonCodec::IS_TEXT,
153
154 #[cfg(feature = "packet-codec-sonic-rs")]
155 Self::SonicRs => WsIoPacketSonicRsCodec::IS_TEXT,
156 }
157 }
158}