ws_tool/
message.rs

1use std::borrow::Cow;
2
3use crate::frame::OpCode;
4
5/// generic message receive/send from websocket stream
6#[derive(Debug)]
7pub struct Message<T> {
8    /// opcode of message
9    ///
10    /// see all codes in [overview](https://datatracker.ietf.org/doc/html/rfc6455#section-5.2) of opcode
11    pub code: OpCode,
12    /// payload of message
13    pub data: T,
14
15    /// available in close frame only
16    ///
17    /// see [status code](https://datatracker.ietf.org/doc/html/rfc6455#section-7.4)
18    pub close_code: Option<u16>,
19}
20
21impl<T> Message<T> {
22    /// consume message and return payload
23    pub fn into(self) -> T {
24        self.data
25    }
26}
27
28impl<'a> From<&'a str> for Message<Cow<'a, str>> {
29    fn from(data: &'a str) -> Self {
30        Message {
31            code: OpCode::Text,
32            data: Cow::Borrowed(data),
33            close_code: None,
34        }
35    }
36}
37
38impl<'a> From<&'a String> for Message<Cow<'a, str>> {
39    fn from(data: &'a String) -> Self {
40        Message {
41            code: OpCode::Text,
42            data: Cow::Borrowed(data),
43            close_code: None,
44        }
45    }
46}
47
48impl<'a> From<Cow<'a, str>> for Message<Cow<'a, str>> {
49    fn from(data: Cow<'a, str>) -> Self {
50        Message {
51            code: OpCode::Text,
52            data,
53            close_code: None,
54        }
55    }
56}
57
58impl<'a> From<&'a [u8]> for Message<Cow<'a, [u8]>> {
59    fn from(data: &'a [u8]) -> Self {
60        Message {
61            code: OpCode::Binary,
62            data: Cow::Borrowed(data),
63            close_code: None,
64        }
65    }
66}
67
68impl<'a> From<Cow<'a, [u8]>> for Message<Cow<'a, [u8]>> {
69    fn from(data: Cow<'a, [u8]>) -> Self {
70        Message {
71            code: OpCode::Binary,
72            data,
73            close_code: None,
74        }
75    }
76}
77
78impl<'a, T: Into<Cow<'a, str>>> From<(u16, T)> for Message<Cow<'a, str>> {
79    fn from((close_code, value): (u16, T)) -> Self {
80        Message {
81            code: OpCode::Close,
82            data: value.into(),
83            close_code: Some(close_code),
84        }
85    }
86}
87
88impl<'a, T: Into<Cow<'a, [u8]>>> From<(u16, T)> for Message<Cow<'a, [u8]>> {
89    fn from((close_code, value): (u16, T)) -> Self {
90        Message {
91            code: OpCode::Binary,
92            data: value.into(),
93            close_code: Some(close_code),
94        }
95    }
96}
97
98impl<'a, T: Into<Cow<'a, str>>> From<(OpCode, T)> for Message<Cow<'a, str>> {
99    fn from((code, value): (OpCode, T)) -> Self {
100        Message {
101            code,
102            data: value.into(),
103            close_code: None,
104        }
105    }
106}
107
108impl<'a, T: Into<Cow<'a, [u8]>>> From<(OpCode, T)> for Message<Cow<'a, [u8]>> {
109    fn from((code, value): (OpCode, T)) -> Self {
110        Message {
111            code,
112            data: value.into(),
113            close_code: None,
114        }
115    }
116}