1use std::borrow::Cow;
2
3use crate::frame::OpCode;
4
5#[derive(Debug)]
7pub struct Message<T> {
8 pub code: OpCode,
12 pub data: T,
14
15 pub close_code: Option<u16>,
19}
20
21impl<T> Message<T> {
22 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}