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 #[cfg(feature = "packet-codec-cbor")]
33 Cbor,
34 #[cfg(feature = "packet-codec-msgpack")]
35 MsgPack,
36 SerdeJson,
37 #[cfg(feature = "packet-codec-sonic-rs")]
38 SonicRs,
39}
40
41impl WsIoPacketCodec {
42 #[inline]
43 pub fn decode(&self, bytes: &[u8]) -> Result<WsIoPacket> {
44 match self {
45 #[cfg(feature = "packet-codec-bincode")]
46 Self::Bincode => WsIoPacketBincodeCodec.decode(bytes),
47 #[cfg(feature = "packet-codec-cbor")]
48 Self::Cbor => WsIoPacketCborCodec.decode(bytes),
49 #[cfg(feature = "packet-codec-msgpack")]
50 Self::MsgPack => WsIoPacketMsgPackCodec.decode(bytes),
51 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode(bytes),
52 #[cfg(feature = "packet-codec-sonic-rs")]
53 Self::SonicRs => WsIoPacketSonicRsCodec.decode(bytes),
54 }
55 }
56
57 #[inline]
58 pub fn decode_data<D: DeserializeOwned>(&self, bytes: &[u8]) -> Result<D> {
59 match self {
60 #[cfg(feature = "packet-codec-bincode")]
61 Self::Bincode => WsIoPacketBincodeCodec.decode_data(bytes),
62 #[cfg(feature = "packet-codec-cbor")]
63 Self::Cbor => WsIoPacketCborCodec.decode_data(bytes),
64 #[cfg(feature = "packet-codec-msgpack")]
65 Self::MsgPack => WsIoPacketMsgPackCodec.decode_data(bytes),
66 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode_data(bytes),
67 #[cfg(feature = "packet-codec-sonic-rs")]
68 Self::SonicRs => WsIoPacketSonicRsCodec.decode_data(bytes),
69 }
70 }
71
72 #[inline]
73 pub fn encode(&self, packet: &WsIoPacket) -> Result<Vec<u8>> {
74 match self {
75 #[cfg(feature = "packet-codec-bincode")]
76 Self::Bincode => WsIoPacketBincodeCodec.encode(packet.clone()),
77 #[cfg(feature = "packet-codec-cbor")]
78 Self::Cbor => WsIoPacketCborCodec.encode(packet),
79 #[cfg(feature = "packet-codec-msgpack")]
80 Self::MsgPack => WsIoPacketMsgPackCodec.encode(packet.clone()),
81 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode(packet),
82 #[cfg(feature = "packet-codec-sonic-rs")]
83 Self::SonicRs => WsIoPacketSonicRsCodec.encode(packet),
84 }
85 }
86
87 #[inline]
88 pub fn empty_data_encoded(&self) -> &[u8] {
89 match self {
90 #[cfg(feature = "packet-codec-bincode")]
91 Self::Bincode => WsIoPacketBincodeCodec.empty_data_encoded(),
92 #[cfg(feature = "packet-codec-cbor")]
93 Self::Cbor => WsIoPacketCborCodec.empty_data_encoded(),
94 #[cfg(feature = "packet-codec-msgpack")]
95 Self::MsgPack => WsIoPacketMsgPackCodec.empty_data_encoded(),
96 Self::SerdeJson => WsIoPacketSerdeJsonCodec.empty_data_encoded(),
97 #[cfg(feature = "packet-codec-sonic-rs")]
98 Self::SonicRs => WsIoPacketSonicRsCodec.empty_data_encoded(),
99 }
100 }
101
102 #[inline]
103 pub fn encode_data<D: Serialize>(&self, data: &D) -> Result<Vec<u8>> {
104 match self {
105 #[cfg(feature = "packet-codec-bincode")]
106 Self::Bincode => WsIoPacketBincodeCodec.encode_data(data),
107 #[cfg(feature = "packet-codec-cbor")]
108 Self::Cbor => WsIoPacketCborCodec.encode_data(data),
109 #[cfg(feature = "packet-codec-msgpack")]
110 Self::MsgPack => WsIoPacketMsgPackCodec.encode_data(data),
111 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode_data(data),
112 #[cfg(feature = "packet-codec-sonic-rs")]
113 Self::SonicRs => WsIoPacketSonicRsCodec.encode_data(data),
114 }
115 }
116
117 pub fn is_text(&self) -> bool {
118 match self {
119 #[cfg(feature = "packet-codec-bincode")]
120 Self::Bincode => WsIoPacketBincodeCodec::IS_TEXT,
121 #[cfg(feature = "packet-codec-cbor")]
122 Self::Cbor => WsIoPacketCborCodec::IS_TEXT,
123 #[cfg(feature = "packet-codec-msgpack")]
124 Self::MsgPack => WsIoPacketMsgPackCodec::IS_TEXT,
125 Self::SerdeJson => WsIoPacketSerdeJsonCodec::IS_TEXT,
126 #[cfg(feature = "packet-codec-sonic-rs")]
127 Self::SonicRs => WsIoPacketSonicRsCodec::IS_TEXT,
128 }
129 }
130}