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#[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}