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