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// Enums
38#[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}