overnet_core/proxy/handle/
event_pair.rs
1use super::signals::Collector;
6use super::{
7 IntoProxied, Message, Proxyable, ProxyableRW, ReadValue, RouterHolder, Serializer, IO,
8};
9use crate::peer::PeerConnRef;
10use anyhow::{format_err, Error};
11use fidl::{AsHandleRef, HandleBased, Peered, Signals};
12use std::task::{Context, Poll};
13use zx_status;
14
15pub(crate) struct EventPair {
16 event_pair: fidl::EventPair,
17}
18
19impl std::fmt::Debug for EventPair {
20 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21 self.event_pair.fmt(f)
22 }
23}
24
25impl Proxyable for EventPair {
26 type Message = EventPairMessage;
27
28 fn from_fidl_handle(hdl: fidl::Handle) -> Result<Self, Error> {
29 Ok(fidl::EventPair::from_handle(hdl).into_proxied()?)
30 }
31
32 fn into_fidl_handle(self) -> Result<fidl::Handle, Error> {
33 Ok(self.event_pair.into_handle())
34 }
35
36 fn signal_peer(&self, clear: Signals, set: Signals) -> Result<(), Error> {
37 self.event_pair.signal_peer(clear, set).map_err(Into::into)
38 }
39}
40
41impl<'a> ProxyableRW<'a> for EventPair {
42 type Reader = EventPairReader<'a>;
43 type Writer = EventPairWriter;
44}
45
46impl IntoProxied for fidl::EventPair {
47 type Proxied = EventPair;
48 fn into_proxied(self) -> Result<EventPair, Error> {
49 Ok(EventPair { event_pair: self })
50 }
51}
52
53#[derive(Debug, Default, PartialEq)]
54pub(crate) struct EventPairMessage;
55
56impl Message for EventPairMessage {
57 type Parser = EventPairParser;
58 type Serializer = EventPairSerializer;
59}
60
61pub(crate) struct EventPairReader<'a> {
62 collector: Collector<'a>,
63}
64
65impl<'a> IO<'a> for EventPairReader<'a> {
66 type Proxyable = EventPair;
67 type Output = ReadValue;
68 fn new() -> Self {
69 EventPairReader { collector: Default::default() }
70 }
71 fn poll_io(
72 &mut self,
73 _: &mut EventPairMessage,
74 event_pair: &'a EventPair,
75 fut_ctx: &mut Context<'_>,
76 ) -> Poll<Result<ReadValue, zx_status::Status>> {
77 let read_result = Poll::Pending;
79 self.collector.after_read(fut_ctx, event_pair.event_pair.as_handle_ref(), read_result, true)
80 }
81}
82
83pub(crate) struct EventPairWriter;
84
85impl IO<'_> for EventPairWriter {
86 type Proxyable = EventPair;
87 type Output = ();
88 fn new() -> Self {
89 EventPairWriter
90 }
91 fn poll_io(
92 &mut self,
93 _: &mut EventPairMessage,
94 _: &EventPair,
95 _: &mut Context<'_>,
96 ) -> Poll<Result<(), zx_status::Status>> {
97 unreachable!()
99 }
100}
101
102#[derive(Debug)]
103pub(crate) struct EventPairSerializer;
104
105impl Serializer for EventPairSerializer {
106 type Message = EventPairMessage;
107 fn new() -> EventPairSerializer {
108 EventPairSerializer
109 }
110 fn poll_ser(
111 &mut self,
112 _: &mut Self::Message,
113 _: &mut Vec<u8>,
114 _: PeerConnRef<'_>,
115 _: &mut RouterHolder<'_>,
116 _: &mut Context<'_>,
117 ) -> Poll<Result<(), Error>> {
118 unreachable!()
120 }
121}
122
123#[derive(Debug)]
124pub(crate) struct EventPairParser;
125
126impl Serializer for EventPairParser {
127 type Message = EventPairMessage;
128 fn new() -> EventPairParser {
129 EventPairParser
130 }
131 fn poll_ser(
132 &mut self,
133 _: &mut Self::Message,
134 _: &mut Vec<u8>,
135 _: PeerConnRef<'_>,
136 _: &mut RouterHolder<'_>,
137 _: &mut Context<'_>,
138 ) -> Poll<Result<(), Error>> {
139 Poll::Ready(Err(format_err!("Event pairs do not exchange message payloads")))
140 }
141}