wsio_core/packet/codecs/
mod.rs

1use 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}