Skip to main content

dope_core/io/socket/msg/
builder.rs

1use dope_sys::io::socket::msg::{Header, Iovec};
2use o3::buffer::bytes::bounded;
3
4use crate::io::{socket, socket::msg};
5
6/// Configures one send header while retaining every installed resource.
7///
8pub struct Builder<'a> {
9    pub(super) header: &'a mut Header,
10}
11
12impl<'a> Builder<'a> {
13    pub fn new(header: &'a mut Header) -> Self {
14        *header = Header::new();
15        Self { header }
16    }
17
18    pub fn name(&mut self, addr: &'a socket::Inet) {
19        use socket::Prepared as _;
20
21        self.header.name(addr.view().native());
22    }
23
24    /// Installs ancillary bytes and retains their borrow with the graph.
25    pub fn control(&mut self, control: &'a [u8]) {
26        self.header.control(control);
27    }
28
29    #[must_use]
30    pub fn finish<T: AsRef<[u8]>>(
31        self,
32        iovecs: &'a mut [Iovec; 1],
33        payload: &'a bounded::Value<T>,
34    ) -> msg::Message<'a> {
35        *iovecs = [Iovec::from_slice(payload.as_ref())];
36        self.header.bind(iovecs);
37        msg::Message {
38            header: self.header,
39        }
40    }
41}