rsocket_rust/payload/
setup.rs1use std::time::Duration;
2
3use bytes::Bytes;
4
5use super::misc::bytes_to_utf8;
6use crate::frame::Setup;
7use crate::utils::DEFAULT_MIME_TYPE;
8
9#[derive(Debug)]
10pub struct SetupPayload {
11    m: Option<Bytes>,
12    d: Option<Bytes>,
13    keepalive: (Duration, Duration),
14    mime_m: Option<Bytes>,
15    mime_d: Option<Bytes>,
16}
17
18#[derive(Debug)]
19pub struct SetupPayloadBuilder {
20    inner: SetupPayload,
21}
22
23impl SetupPayload {
24    pub fn builder() -> SetupPayloadBuilder {
25        SetupPayloadBuilder::new()
26    }
27}
28
29impl SetupPayloadBuilder {
30    fn new() -> SetupPayloadBuilder {
31        SetupPayloadBuilder {
32            inner: SetupPayload {
33                m: None,
34                d: None,
35                keepalive: (Duration::from_secs(20), Duration::from_secs(90)),
36                mime_m: Some(Bytes::from(DEFAULT_MIME_TYPE.to_owned())),
37                mime_d: Some(Bytes::from(DEFAULT_MIME_TYPE.to_owned())),
38            },
39        }
40    }
41
42    pub fn set_metadata<A>(mut self, metadata: A) -> Self
43    where
44        A: Into<Vec<u8>>,
45    {
46        self.inner.m = Some(Bytes::from(metadata.into()));
47        self
48    }
49
50    pub fn set_metadata_utf8(mut self, metadata: &str) -> Self {
51        self.inner.m = Some(Bytes::from(String::from(metadata)));
52        self
53    }
54
55    pub(crate) fn set_data_bytes(mut self, data: Option<Bytes>) -> Self {
56        self.inner.d = data;
57        self
58    }
59
60    pub(crate) fn set_metadata_bytes(mut self, data: Option<Bytes>) -> Self {
61        self.inner.m = data;
62        self
63    }
64
65    pub fn set_data<A>(mut self, data: A) -> Self
66    where
67        A: Into<Vec<u8>>,
68    {
69        self.inner.d = Some(Bytes::from(data.into()));
70        self
71    }
72
73    pub fn set_data_utf8(mut self, data: &str) -> Self {
74        self.inner.d = Some(Bytes::from(data.to_owned()));
75        self
76    }
77
78    pub fn set_keepalive(
79        mut self,
80        tick_period: Duration,
81        ack_timeout: Duration,
82        missed_acks: u64,
83    ) -> Self {
84        let lifetime_mills = (ack_timeout.as_millis() as u64) * missed_acks;
85        self.inner.keepalive = (tick_period, Duration::from_millis(lifetime_mills));
86        self
87    }
88
89    pub fn set_data_mime_type(mut self, mime: impl Into<String>) -> Self {
90        self.inner.mime_d = Some(Bytes::from(mime.into()));
91        self
92    }
93    pub fn set_metadata_mime_type(mut self, mime: impl Into<String>) -> Self {
94        self.inner.mime_m = Some(Bytes::from(mime.into()));
95        self
96    }
97
98    pub fn build(self) -> SetupPayload {
99        self.inner
100    }
101}
102
103impl SetupPayload {
104    pub fn metadata(&self) -> Option<&Bytes> {
105        self.m.as_ref()
106    }
107
108    pub fn data(&self) -> Option<&Bytes> {
109        self.d.as_ref()
110    }
111
112    pub fn split(self) -> (Option<Bytes>, Option<Bytes>) {
113        (self.d, self.m)
114    }
115
116    pub fn keepalive_interval(&self) -> Duration {
117        self.keepalive.0
118    }
119
120    pub fn keepalive_lifetime(&self) -> Duration {
121        self.keepalive.1
122    }
123
124    pub fn metadata_mime_type(&self) -> Option<&str> {
125        bytes_to_utf8(&self.mime_m)
126    }
127
128    pub fn data_mime_type(&self) -> Option<&str> {
129        bytes_to_utf8(&self.mime_d)
130    }
131}
132
133impl From<Setup> for SetupPayload {
134    fn from(input: Setup) -> SetupPayload {
135        let mut bu = SetupPayload::builder();
136        if let Some(m) = input.get_mime_data() {
138            bu = bu.set_data_mime_type(m);
139        }
140        if let Some(m) = input.get_mime_metadata() {
141            bu = bu.set_metadata_mime_type(m);
142        }
143        let keepalive = (input.get_keepalive(), input.get_lifetime());
144        let (d, m) = input.split();
145        bu.inner.d = d;
146        bu.inner.m = m;
147        let mut pa = bu.build();
148        pa.keepalive = keepalive;
149        pa
150    }
151}