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-msgpack")]
10mod msgpack;
11mod serde_json;
12#[cfg(feature = "packet-codec-sonic-rs")]
13mod sonic_rs;
14
15#[cfg(feature = "packet-codec-bincode")]
16use self::bincode::WsIoPacketBincodeCodec;
17#[cfg(feature = "packet-codec-msgpack")]
18use self::msgpack::WsIoPacketMsgPackCodec;
19use self::serde_json::WsIoPacketSerdeJsonCodec;
20#[cfg(feature = "packet-codec-sonic-rs")]
21use self::sonic_rs::WsIoPacketSonicRsCodec;
22use super::WsIoPacket;
23
24#[derive(Clone, Copy, Debug)]
25pub enum WsIoPacketCodec {
26 #[cfg(feature = "packet-codec-bincode")]
27 Bincode,
28 #[cfg(feature = "packet-codec-msgpack")]
29 MsgPack,
30 SerdeJson,
31 #[cfg(feature = "packet-codec-sonic-rs")]
32 SonicRs,
33}
34
35impl WsIoPacketCodec {
36 #[inline]
37 pub fn decode(&self, bytes: &[u8]) -> Result<WsIoPacket> {
38 match self {
39 #[cfg(feature = "packet-codec-bincode")]
40 Self::Bincode => WsIoPacketBincodeCodec.decode(bytes),
41 #[cfg(feature = "packet-codec-msgpack")]
42 Self::MsgPack => WsIoPacketMsgPackCodec.decode(bytes),
43 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode(bytes),
44 #[cfg(feature = "packet-codec-sonic-rs")]
45 Self::SonicRs => WsIoPacketSonicRsCodec.decode(bytes),
46 }
47 }
48
49 #[inline]
50 pub fn decode_data<D: DeserializeOwned>(&self, bytes: &[u8]) -> Result<D> {
51 match self {
52 #[cfg(feature = "packet-codec-bincode")]
53 Self::Bincode => WsIoPacketBincodeCodec.decode_data(bytes),
54 #[cfg(feature = "packet-codec-msgpack")]
55 Self::MsgPack => WsIoPacketMsgPackCodec.decode_data(bytes),
56 Self::SerdeJson => WsIoPacketSerdeJsonCodec.decode_data(bytes),
57 #[cfg(feature = "packet-codec-sonic-rs")]
58 Self::SonicRs => WsIoPacketSonicRsCodec.decode_data(bytes),
59 }
60 }
61
62 #[inline]
63 pub fn encode(&self, packet: &WsIoPacket) -> Result<Vec<u8>> {
64 match self {
65 #[cfg(feature = "packet-codec-bincode")]
66 Self::Bincode => WsIoPacketBincodeCodec.encode(packet.clone()),
67 #[cfg(feature = "packet-codec-msgpack")]
68 Self::MsgPack => WsIoPacketMsgPackCodec.encode(packet.clone()),
69 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode(packet),
70 #[cfg(feature = "packet-codec-sonic-rs")]
71 Self::SonicRs => WsIoPacketSonicRsCodec.encode(packet),
72 }
73 }
74
75 #[inline]
76 pub fn empty_data_encoded(&self) -> &[u8] {
77 match self {
78 #[cfg(feature = "packet-codec-bincode")]
79 Self::Bincode => WsIoPacketBincodeCodec.empty_data_encoded(),
80 #[cfg(feature = "packet-codec-msgpack")]
81 Self::MsgPack => WsIoPacketMsgPackCodec.empty_data_encoded(),
82 Self::SerdeJson => WsIoPacketSerdeJsonCodec.empty_data_encoded(),
83 #[cfg(feature = "packet-codec-sonic-rs")]
84 Self::SonicRs => WsIoPacketSonicRsCodec.empty_data_encoded(),
85 }
86 }
87
88 #[inline]
89 pub fn encode_data<D: Serialize>(&self, data: &D) -> Result<Vec<u8>> {
90 match self {
91 #[cfg(feature = "packet-codec-bincode")]
92 Self::Bincode => WsIoPacketBincodeCodec.encode_data(data),
93 #[cfg(feature = "packet-codec-msgpack")]
94 Self::MsgPack => WsIoPacketMsgPackCodec.encode_data(data),
95 Self::SerdeJson => WsIoPacketSerdeJsonCodec.encode_data(data),
96 #[cfg(feature = "packet-codec-sonic-rs")]
97 Self::SonicRs => WsIoPacketSonicRsCodec.encode_data(data),
98 }
99 }
100
101 pub fn is_text(&self) -> bool {
102 match self {
103 #[cfg(feature = "packet-codec-bincode")]
104 Self::Bincode => WsIoPacketBincodeCodec::IS_TEXT,
105 #[cfg(feature = "packet-codec-msgpack")]
106 Self::MsgPack => WsIoPacketMsgPackCodec::IS_TEXT,
107 Self::SerdeJson => WsIoPacketSerdeJsonCodec::IS_TEXT,
108 #[cfg(feature = "packet-codec-sonic-rs")]
109 Self::SonicRs => WsIoPacketSonicRsCodec::IS_TEXT,
110 }
111 }
112}