summary refs log tree commit diff
path: root/msg_socket2/src/ser.rs
blob: 7bffa2233109092672e34dc5a07d5bde6aaf5f56 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use serde::Serializer;
use std::os::unix::prelude::*;

pub trait SerializerWithFds {
    type Ser: Serializer;

    fn serializer(self) -> Self::Ser;
    fn fds(&mut self) -> &mut Vec<RawFd>;
}

pub trait SerializeWithFds {
    fn serialize<Ser: SerializerWithFds>(
        &self,
        serializer: Ser,
    ) -> Result<<Ser::Ser as Serializer>::Ok, <Ser::Ser as Serializer>::Error>;
}

#[derive(Debug)]
pub struct SerializerWithFdsImpl<'fds, Ser> {
    serializer: Ser,
    fds: &'fds mut Vec<RawFd>,
}

impl<'fds, Ser> SerializerWithFdsImpl<'fds, Ser> {
    pub fn new(fds: &'fds mut Vec<RawFd>, serializer: Ser) -> Self {
        Self { serializer, fds }
    }
}

impl<'fds, Ser: Serializer> SerializerWithFds for SerializerWithFdsImpl<'fds, Ser> {
    type Ser = Ser;

    fn serializer(self) -> Self::Ser {
        self.serializer
    }

    fn fds(&mut self) -> &mut Vec<RawFd> {
        &mut self.fds
    }
}