summary refs log tree commit diff
path: root/msg_socket2/src/ser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'msg_socket2/src/ser.rs')
-rw-r--r--msg_socket2/src/ser.rs34
1 files changed, 27 insertions, 7 deletions
diff --git a/msg_socket2/src/ser.rs b/msg_socket2/src/ser.rs
index 0a60ea8..7bffa22 100644
--- a/msg_socket2/src/ser.rs
+++ b/msg_socket2/src/ser.rs
@@ -1,20 +1,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>(&self, serializer: SerializerWithFds<Ser>) -> Result<Ser::Ok, Ser::Error>
-    where
-        Ser: Serializer;
+    fn serialize<Ser: SerializerWithFds>(
+        &self,
+        serializer: Ser,
+    ) -> Result<<Ser::Ser as Serializer>::Ok, <Ser::Ser as Serializer>::Error>;
 }
 
 #[derive(Debug)]
-pub struct SerializerWithFds<'fds, Ser> {
-    pub serializer: Ser,
-    pub fds: &'fds mut Vec<RawFd>,
+pub struct SerializerWithFdsImpl<'fds, Ser> {
+    serializer: Ser,
+    fds: &'fds mut Vec<RawFd>,
 }
 
-impl<'fds, Ser> SerializerWithFds<'fds, Ser> {
+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
+    }
+}