Skip to main content

base_scheduler/
owned_socket_recv_message.rs

1// Released under the MIT License.
2// Copyright, 2026, by Samuel Williams.
3
4use crate::{
5    IoBuf, IoBufMut, SocketAddressView, SocketRecvMessage, SocketRecvMessageMut, SocketRecvResult,
6};
7
8/// A received payload owner paired with portable receive metadata. Other message implementations may retain their backend's native metadata instead.
9pub struct OwnedSocketRecvMessage<Buffer: IoBuf> {
10    result: SocketRecvResult,
11    payload: Buffer,
12}
13
14impl<B: IoBuf> OwnedSocketRecvMessage<B> {
15    /// `payload` must expose exactly the received bytes reported by `result.bytes`.
16    pub fn new(result: SocketRecvResult, payload: B) -> Self {
17        assert_eq!(
18            result.bytes,
19            payload.as_ref().len(),
20            "receive metadata and payload lengths differ"
21        );
22        Self { result, payload }
23    }
24}
25
26impl<B: IoBuf> SocketRecvMessage for OwnedSocketRecvMessage<B> {
27    type Payload = B;
28
29    fn address(&self) -> Option<impl SocketAddressView + '_> {
30        self.result.address.as_ref()
31    }
32
33    fn payload(&self) -> &[u8] {
34        self.payload.as_ref()
35    }
36
37    fn truncated(&self) -> bool {
38        self.result.truncated
39    }
40
41    fn control_truncated(&self) -> bool {
42        self.result.control_truncated
43    }
44
45    fn into_payload(self) -> B {
46        self.payload
47    }
48}
49
50impl<B: IoBufMut> SocketRecvMessageMut for OwnedSocketRecvMessage<B> {
51    fn payload_mut(&mut self) -> &mut [u8] {
52        self.payload.as_mut()
53    }
54}