fidl_fuchsia_developer_ffx_speedtest/
fidl_fuchsia_developer_ffx_speedtest.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_developer_ffx_speedtest__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct SpeedtestSocketDownRequest {
16    pub socket: fidl::Socket,
17    pub params: TransferParams,
18}
19
20impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
21    for SpeedtestSocketDownRequest
22{
23}
24
25#[derive(Debug, PartialEq)]
26pub struct SpeedtestSocketUpRequest {
27    pub socket: fidl::Socket,
28    pub params: TransferParams,
29}
30
31impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for SpeedtestSocketUpRequest {}
32
33#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
34pub struct SpeedtestMarker;
35
36impl fidl::endpoints::ProtocolMarker for SpeedtestMarker {
37    type Proxy = SpeedtestProxy;
38    type RequestStream = SpeedtestRequestStream;
39    #[cfg(target_os = "fuchsia")]
40    type SynchronousProxy = SpeedtestSynchronousProxy;
41
42    const DEBUG_NAME: &'static str = "fuchsia.developer.ffx.speedtest.Speedtest";
43}
44impl fidl::endpoints::DiscoverableProtocolMarker for SpeedtestMarker {}
45
46pub trait SpeedtestProxyInterface: Send + Sync {
47    type PingResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
48    fn r#ping(&self) -> Self::PingResponseFut;
49    type SocketUpResponseFut: std::future::Future<Output = Result<TransferReport, fidl::Error>>
50        + Send;
51    fn r#socket_up(
52        &self,
53        socket: fidl::Socket,
54        params: &TransferParams,
55    ) -> Self::SocketUpResponseFut;
56    type SocketDownResponseFut: std::future::Future<Output = Result<TransferReport, fidl::Error>>
57        + Send;
58    fn r#socket_down(
59        &self,
60        socket: fidl::Socket,
61        params: &TransferParams,
62    ) -> Self::SocketDownResponseFut;
63}
64#[derive(Debug)]
65#[cfg(target_os = "fuchsia")]
66pub struct SpeedtestSynchronousProxy {
67    client: fidl::client::sync::Client,
68}
69
70#[cfg(target_os = "fuchsia")]
71impl fidl::endpoints::SynchronousProxy for SpeedtestSynchronousProxy {
72    type Proxy = SpeedtestProxy;
73    type Protocol = SpeedtestMarker;
74
75    fn from_channel(inner: fidl::Channel) -> Self {
76        Self::new(inner)
77    }
78
79    fn into_channel(self) -> fidl::Channel {
80        self.client.into_channel()
81    }
82
83    fn as_channel(&self) -> &fidl::Channel {
84        self.client.as_channel()
85    }
86}
87
88#[cfg(target_os = "fuchsia")]
89impl SpeedtestSynchronousProxy {
90    pub fn new(channel: fidl::Channel) -> Self {
91        let protocol_name = <SpeedtestMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
92        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
93    }
94
95    pub fn into_channel(self) -> fidl::Channel {
96        self.client.into_channel()
97    }
98
99    /// Waits until an event arrives and returns it. It is safe for other
100    /// threads to make concurrent requests while waiting for an event.
101    pub fn wait_for_event(
102        &self,
103        deadline: zx::MonotonicInstant,
104    ) -> Result<SpeedtestEvent, fidl::Error> {
105        SpeedtestEvent::decode(self.client.wait_for_event(deadline)?)
106    }
107
108    /// No-op, server responds immediately.
109    pub fn r#ping(&self, ___deadline: zx::MonotonicInstant) -> Result<(), fidl::Error> {
110        let _response = self.client.send_query::<
111            fidl::encoding::EmptyPayload,
112            fidl::encoding::FlexibleType<fidl::encoding::EmptyStruct>,
113        >(
114            (),
115            0x1511ccb237874689,
116            fidl::encoding::DynamicFlags::FLEXIBLE,
117            ___deadline,
118        )?
119        .into_result::<SpeedtestMarker>("ping")?;
120        Ok(_response)
121    }
122
123    /// Server writes data into the provided zircon socket and reports stats.
124    pub fn r#socket_up(
125        &self,
126        mut socket: fidl::Socket,
127        mut params: &TransferParams,
128        ___deadline: zx::MonotonicInstant,
129    ) -> Result<TransferReport, fidl::Error> {
130        let _response = self
131            .client
132            .send_query::<SpeedtestSocketUpRequest, fidl::encoding::FlexibleType<TransferReport>>(
133                (socket, params),
134                0x7c530a369209ae87,
135                fidl::encoding::DynamicFlags::FLEXIBLE,
136                ___deadline,
137            )?
138            .into_result::<SpeedtestMarker>("socket_up")?;
139        Ok(_response)
140    }
141
142    /// Server reads data from the provided zircon socket and reports stats.
143    pub fn r#socket_down(
144        &self,
145        mut socket: fidl::Socket,
146        mut params: &TransferParams,
147        ___deadline: zx::MonotonicInstant,
148    ) -> Result<TransferReport, fidl::Error> {
149        let _response = self
150            .client
151            .send_query::<SpeedtestSocketDownRequest, fidl::encoding::FlexibleType<TransferReport>>(
152                (socket, params),
153                0x426e13de44070751,
154                fidl::encoding::DynamicFlags::FLEXIBLE,
155                ___deadline,
156            )?
157            .into_result::<SpeedtestMarker>("socket_down")?;
158        Ok(_response)
159    }
160}
161
162#[cfg(target_os = "fuchsia")]
163impl From<SpeedtestSynchronousProxy> for zx::Handle {
164    fn from(value: SpeedtestSynchronousProxy) -> Self {
165        value.into_channel().into()
166    }
167}
168
169#[cfg(target_os = "fuchsia")]
170impl From<fidl::Channel> for SpeedtestSynchronousProxy {
171    fn from(value: fidl::Channel) -> Self {
172        Self::new(value)
173    }
174}
175
176#[derive(Debug, Clone)]
177pub struct SpeedtestProxy {
178    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
179}
180
181impl fidl::endpoints::Proxy for SpeedtestProxy {
182    type Protocol = SpeedtestMarker;
183
184    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
185        Self::new(inner)
186    }
187
188    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
189        self.client.into_channel().map_err(|client| Self { client })
190    }
191
192    fn as_channel(&self) -> &::fidl::AsyncChannel {
193        self.client.as_channel()
194    }
195}
196
197impl SpeedtestProxy {
198    /// Create a new Proxy for fuchsia.developer.ffx.speedtest/Speedtest.
199    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
200        let protocol_name = <SpeedtestMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
201        Self { client: fidl::client::Client::new(channel, protocol_name) }
202    }
203
204    /// Get a Stream of events from the remote end of the protocol.
205    ///
206    /// # Panics
207    ///
208    /// Panics if the event stream was already taken.
209    pub fn take_event_stream(&self) -> SpeedtestEventStream {
210        SpeedtestEventStream { event_receiver: self.client.take_event_receiver() }
211    }
212
213    /// No-op, server responds immediately.
214    pub fn r#ping(
215        &self,
216    ) -> fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect> {
217        SpeedtestProxyInterface::r#ping(self)
218    }
219
220    /// Server writes data into the provided zircon socket and reports stats.
221    pub fn r#socket_up(
222        &self,
223        mut socket: fidl::Socket,
224        mut params: &TransferParams,
225    ) -> fidl::client::QueryResponseFut<TransferReport, fidl::encoding::DefaultFuchsiaResourceDialect>
226    {
227        SpeedtestProxyInterface::r#socket_up(self, socket, params)
228    }
229
230    /// Server reads data from the provided zircon socket and reports stats.
231    pub fn r#socket_down(
232        &self,
233        mut socket: fidl::Socket,
234        mut params: &TransferParams,
235    ) -> fidl::client::QueryResponseFut<TransferReport, fidl::encoding::DefaultFuchsiaResourceDialect>
236    {
237        SpeedtestProxyInterface::r#socket_down(self, socket, params)
238    }
239}
240
241impl SpeedtestProxyInterface for SpeedtestProxy {
242    type PingResponseFut =
243        fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect>;
244    fn r#ping(&self) -> Self::PingResponseFut {
245        fn _decode(
246            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
247        ) -> Result<(), fidl::Error> {
248            let _response = fidl::client::decode_transaction_body::<
249                fidl::encoding::FlexibleType<fidl::encoding::EmptyStruct>,
250                fidl::encoding::DefaultFuchsiaResourceDialect,
251                0x1511ccb237874689,
252            >(_buf?)?
253            .into_result::<SpeedtestMarker>("ping")?;
254            Ok(_response)
255        }
256        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, ()>(
257            (),
258            0x1511ccb237874689,
259            fidl::encoding::DynamicFlags::FLEXIBLE,
260            _decode,
261        )
262    }
263
264    type SocketUpResponseFut = fidl::client::QueryResponseFut<
265        TransferReport,
266        fidl::encoding::DefaultFuchsiaResourceDialect,
267    >;
268    fn r#socket_up(
269        &self,
270        mut socket: fidl::Socket,
271        mut params: &TransferParams,
272    ) -> Self::SocketUpResponseFut {
273        fn _decode(
274            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
275        ) -> Result<TransferReport, fidl::Error> {
276            let _response = fidl::client::decode_transaction_body::<
277                fidl::encoding::FlexibleType<TransferReport>,
278                fidl::encoding::DefaultFuchsiaResourceDialect,
279                0x7c530a369209ae87,
280            >(_buf?)?
281            .into_result::<SpeedtestMarker>("socket_up")?;
282            Ok(_response)
283        }
284        self.client.send_query_and_decode::<SpeedtestSocketUpRequest, TransferReport>(
285            (socket, params),
286            0x7c530a369209ae87,
287            fidl::encoding::DynamicFlags::FLEXIBLE,
288            _decode,
289        )
290    }
291
292    type SocketDownResponseFut = fidl::client::QueryResponseFut<
293        TransferReport,
294        fidl::encoding::DefaultFuchsiaResourceDialect,
295    >;
296    fn r#socket_down(
297        &self,
298        mut socket: fidl::Socket,
299        mut params: &TransferParams,
300    ) -> Self::SocketDownResponseFut {
301        fn _decode(
302            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
303        ) -> Result<TransferReport, fidl::Error> {
304            let _response = fidl::client::decode_transaction_body::<
305                fidl::encoding::FlexibleType<TransferReport>,
306                fidl::encoding::DefaultFuchsiaResourceDialect,
307                0x426e13de44070751,
308            >(_buf?)?
309            .into_result::<SpeedtestMarker>("socket_down")?;
310            Ok(_response)
311        }
312        self.client.send_query_and_decode::<SpeedtestSocketDownRequest, TransferReport>(
313            (socket, params),
314            0x426e13de44070751,
315            fidl::encoding::DynamicFlags::FLEXIBLE,
316            _decode,
317        )
318    }
319}
320
321pub struct SpeedtestEventStream {
322    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
323}
324
325impl std::marker::Unpin for SpeedtestEventStream {}
326
327impl futures::stream::FusedStream for SpeedtestEventStream {
328    fn is_terminated(&self) -> bool {
329        self.event_receiver.is_terminated()
330    }
331}
332
333impl futures::Stream for SpeedtestEventStream {
334    type Item = Result<SpeedtestEvent, fidl::Error>;
335
336    fn poll_next(
337        mut self: std::pin::Pin<&mut Self>,
338        cx: &mut std::task::Context<'_>,
339    ) -> std::task::Poll<Option<Self::Item>> {
340        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
341            &mut self.event_receiver,
342            cx
343        )?) {
344            Some(buf) => std::task::Poll::Ready(Some(SpeedtestEvent::decode(buf))),
345            None => std::task::Poll::Ready(None),
346        }
347    }
348}
349
350#[derive(Debug)]
351pub enum SpeedtestEvent {
352    #[non_exhaustive]
353    _UnknownEvent {
354        /// Ordinal of the event that was sent.
355        ordinal: u64,
356    },
357}
358
359impl SpeedtestEvent {
360    /// Decodes a message buffer as a [`SpeedtestEvent`].
361    fn decode(
362        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
363    ) -> Result<SpeedtestEvent, fidl::Error> {
364        let (bytes, _handles) = buf.split_mut();
365        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
366        debug_assert_eq!(tx_header.tx_id, 0);
367        match tx_header.ordinal {
368            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
369                Ok(SpeedtestEvent::_UnknownEvent { ordinal: tx_header.ordinal })
370            }
371            _ => Err(fidl::Error::UnknownOrdinal {
372                ordinal: tx_header.ordinal,
373                protocol_name: <SpeedtestMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
374            }),
375        }
376    }
377}
378
379/// A Stream of incoming requests for fuchsia.developer.ffx.speedtest/Speedtest.
380pub struct SpeedtestRequestStream {
381    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
382    is_terminated: bool,
383}
384
385impl std::marker::Unpin for SpeedtestRequestStream {}
386
387impl futures::stream::FusedStream for SpeedtestRequestStream {
388    fn is_terminated(&self) -> bool {
389        self.is_terminated
390    }
391}
392
393impl fidl::endpoints::RequestStream for SpeedtestRequestStream {
394    type Protocol = SpeedtestMarker;
395    type ControlHandle = SpeedtestControlHandle;
396
397    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
398        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
399    }
400
401    fn control_handle(&self) -> Self::ControlHandle {
402        SpeedtestControlHandle { inner: self.inner.clone() }
403    }
404
405    fn into_inner(
406        self,
407    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
408    {
409        (self.inner, self.is_terminated)
410    }
411
412    fn from_inner(
413        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
414        is_terminated: bool,
415    ) -> Self {
416        Self { inner, is_terminated }
417    }
418}
419
420impl futures::Stream for SpeedtestRequestStream {
421    type Item = Result<SpeedtestRequest, fidl::Error>;
422
423    fn poll_next(
424        mut self: std::pin::Pin<&mut Self>,
425        cx: &mut std::task::Context<'_>,
426    ) -> std::task::Poll<Option<Self::Item>> {
427        let this = &mut *self;
428        if this.inner.check_shutdown(cx) {
429            this.is_terminated = true;
430            return std::task::Poll::Ready(None);
431        }
432        if this.is_terminated {
433            panic!("polled SpeedtestRequestStream after completion");
434        }
435        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
436            |bytes, handles| {
437                match this.inner.channel().read_etc(cx, bytes, handles) {
438                    std::task::Poll::Ready(Ok(())) => {}
439                    std::task::Poll::Pending => return std::task::Poll::Pending,
440                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
441                        this.is_terminated = true;
442                        return std::task::Poll::Ready(None);
443                    }
444                    std::task::Poll::Ready(Err(e)) => {
445                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
446                            e.into(),
447                        ))))
448                    }
449                }
450
451                // A message has been received from the channel
452                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
453
454                std::task::Poll::Ready(Some(match header.ordinal {
455                    0x1511ccb237874689 => {
456                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
457                        let mut req = fidl::new_empty!(
458                            fidl::encoding::EmptyPayload,
459                            fidl::encoding::DefaultFuchsiaResourceDialect
460                        );
461                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
462                        let control_handle = SpeedtestControlHandle { inner: this.inner.clone() };
463                        Ok(SpeedtestRequest::Ping {
464                            responder: SpeedtestPingResponder {
465                                control_handle: std::mem::ManuallyDrop::new(control_handle),
466                                tx_id: header.tx_id,
467                            },
468                        })
469                    }
470                    0x7c530a369209ae87 => {
471                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
472                        let mut req = fidl::new_empty!(
473                            SpeedtestSocketUpRequest,
474                            fidl::encoding::DefaultFuchsiaResourceDialect
475                        );
476                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<SpeedtestSocketUpRequest>(&header, _body_bytes, handles, &mut req)?;
477                        let control_handle = SpeedtestControlHandle { inner: this.inner.clone() };
478                        Ok(SpeedtestRequest::SocketUp {
479                            socket: req.socket,
480                            params: req.params,
481
482                            responder: SpeedtestSocketUpResponder {
483                                control_handle: std::mem::ManuallyDrop::new(control_handle),
484                                tx_id: header.tx_id,
485                            },
486                        })
487                    }
488                    0x426e13de44070751 => {
489                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
490                        let mut req = fidl::new_empty!(
491                            SpeedtestSocketDownRequest,
492                            fidl::encoding::DefaultFuchsiaResourceDialect
493                        );
494                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<SpeedtestSocketDownRequest>(&header, _body_bytes, handles, &mut req)?;
495                        let control_handle = SpeedtestControlHandle { inner: this.inner.clone() };
496                        Ok(SpeedtestRequest::SocketDown {
497                            socket: req.socket,
498                            params: req.params,
499
500                            responder: SpeedtestSocketDownResponder {
501                                control_handle: std::mem::ManuallyDrop::new(control_handle),
502                                tx_id: header.tx_id,
503                            },
504                        })
505                    }
506                    _ if header.tx_id == 0
507                        && header
508                            .dynamic_flags()
509                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
510                    {
511                        Ok(SpeedtestRequest::_UnknownMethod {
512                            ordinal: header.ordinal,
513                            control_handle: SpeedtestControlHandle { inner: this.inner.clone() },
514                            method_type: fidl::MethodType::OneWay,
515                        })
516                    }
517                    _ if header
518                        .dynamic_flags()
519                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
520                    {
521                        this.inner.send_framework_err(
522                            fidl::encoding::FrameworkErr::UnknownMethod,
523                            header.tx_id,
524                            header.ordinal,
525                            header.dynamic_flags(),
526                            (bytes, handles),
527                        )?;
528                        Ok(SpeedtestRequest::_UnknownMethod {
529                            ordinal: header.ordinal,
530                            control_handle: SpeedtestControlHandle { inner: this.inner.clone() },
531                            method_type: fidl::MethodType::TwoWay,
532                        })
533                    }
534                    _ => Err(fidl::Error::UnknownOrdinal {
535                        ordinal: header.ordinal,
536                        protocol_name:
537                            <SpeedtestMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
538                    }),
539                }))
540            },
541        )
542    }
543}
544
545#[derive(Debug)]
546pub enum SpeedtestRequest {
547    /// No-op, server responds immediately.
548    Ping { responder: SpeedtestPingResponder },
549    /// Server writes data into the provided zircon socket and reports stats.
550    SocketUp { socket: fidl::Socket, params: TransferParams, responder: SpeedtestSocketUpResponder },
551    /// Server reads data from the provided zircon socket and reports stats.
552    SocketDown {
553        socket: fidl::Socket,
554        params: TransferParams,
555        responder: SpeedtestSocketDownResponder,
556    },
557    /// An interaction was received which does not match any known method.
558    #[non_exhaustive]
559    _UnknownMethod {
560        /// Ordinal of the method that was called.
561        ordinal: u64,
562        control_handle: SpeedtestControlHandle,
563        method_type: fidl::MethodType,
564    },
565}
566
567impl SpeedtestRequest {
568    #[allow(irrefutable_let_patterns)]
569    pub fn into_ping(self) -> Option<(SpeedtestPingResponder)> {
570        if let SpeedtestRequest::Ping { responder } = self {
571            Some((responder))
572        } else {
573            None
574        }
575    }
576
577    #[allow(irrefutable_let_patterns)]
578    pub fn into_socket_up(
579        self,
580    ) -> Option<(fidl::Socket, TransferParams, SpeedtestSocketUpResponder)> {
581        if let SpeedtestRequest::SocketUp { socket, params, responder } = self {
582            Some((socket, params, responder))
583        } else {
584            None
585        }
586    }
587
588    #[allow(irrefutable_let_patterns)]
589    pub fn into_socket_down(
590        self,
591    ) -> Option<(fidl::Socket, TransferParams, SpeedtestSocketDownResponder)> {
592        if let SpeedtestRequest::SocketDown { socket, params, responder } = self {
593            Some((socket, params, responder))
594        } else {
595            None
596        }
597    }
598
599    /// Name of the method defined in FIDL
600    pub fn method_name(&self) -> &'static str {
601        match *self {
602            SpeedtestRequest::Ping { .. } => "ping",
603            SpeedtestRequest::SocketUp { .. } => "socket_up",
604            SpeedtestRequest::SocketDown { .. } => "socket_down",
605            SpeedtestRequest::_UnknownMethod { method_type: fidl::MethodType::OneWay, .. } => {
606                "unknown one-way method"
607            }
608            SpeedtestRequest::_UnknownMethod { method_type: fidl::MethodType::TwoWay, .. } => {
609                "unknown two-way method"
610            }
611        }
612    }
613}
614
615#[derive(Debug, Clone)]
616pub struct SpeedtestControlHandle {
617    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
618}
619
620impl fidl::endpoints::ControlHandle for SpeedtestControlHandle {
621    fn shutdown(&self) {
622        self.inner.shutdown()
623    }
624    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
625        self.inner.shutdown_with_epitaph(status)
626    }
627
628    fn is_closed(&self) -> bool {
629        self.inner.channel().is_closed()
630    }
631    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
632        self.inner.channel().on_closed()
633    }
634
635    #[cfg(target_os = "fuchsia")]
636    fn signal_peer(
637        &self,
638        clear_mask: zx::Signals,
639        set_mask: zx::Signals,
640    ) -> Result<(), zx_status::Status> {
641        use fidl::Peered;
642        self.inner.channel().signal_peer(clear_mask, set_mask)
643    }
644}
645
646impl SpeedtestControlHandle {}
647
648#[must_use = "FIDL methods require a response to be sent"]
649#[derive(Debug)]
650pub struct SpeedtestPingResponder {
651    control_handle: std::mem::ManuallyDrop<SpeedtestControlHandle>,
652    tx_id: u32,
653}
654
655/// Set the the channel to be shutdown (see [`SpeedtestControlHandle::shutdown`])
656/// if the responder is dropped without sending a response, so that the client
657/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
658impl std::ops::Drop for SpeedtestPingResponder {
659    fn drop(&mut self) {
660        self.control_handle.shutdown();
661        // Safety: drops once, never accessed again
662        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
663    }
664}
665
666impl fidl::endpoints::Responder for SpeedtestPingResponder {
667    type ControlHandle = SpeedtestControlHandle;
668
669    fn control_handle(&self) -> &SpeedtestControlHandle {
670        &self.control_handle
671    }
672
673    fn drop_without_shutdown(mut self) {
674        // Safety: drops once, never accessed again due to mem::forget
675        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
676        // Prevent Drop from running (which would shut down the channel)
677        std::mem::forget(self);
678    }
679}
680
681impl SpeedtestPingResponder {
682    /// Sends a response to the FIDL transaction.
683    ///
684    /// Sets the channel to shutdown if an error occurs.
685    pub fn send(self) -> Result<(), fidl::Error> {
686        let _result = self.send_raw();
687        if _result.is_err() {
688            self.control_handle.shutdown();
689        }
690        self.drop_without_shutdown();
691        _result
692    }
693
694    /// Similar to "send" but does not shutdown the channel if an error occurs.
695    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
696        let _result = self.send_raw();
697        self.drop_without_shutdown();
698        _result
699    }
700
701    fn send_raw(&self) -> Result<(), fidl::Error> {
702        self.control_handle.inner.send::<fidl::encoding::FlexibleType<fidl::encoding::EmptyStruct>>(
703            fidl::encoding::Flexible::new(()),
704            self.tx_id,
705            0x1511ccb237874689,
706            fidl::encoding::DynamicFlags::FLEXIBLE,
707        )
708    }
709}
710
711#[must_use = "FIDL methods require a response to be sent"]
712#[derive(Debug)]
713pub struct SpeedtestSocketUpResponder {
714    control_handle: std::mem::ManuallyDrop<SpeedtestControlHandle>,
715    tx_id: u32,
716}
717
718/// Set the the channel to be shutdown (see [`SpeedtestControlHandle::shutdown`])
719/// if the responder is dropped without sending a response, so that the client
720/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
721impl std::ops::Drop for SpeedtestSocketUpResponder {
722    fn drop(&mut self) {
723        self.control_handle.shutdown();
724        // Safety: drops once, never accessed again
725        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
726    }
727}
728
729impl fidl::endpoints::Responder for SpeedtestSocketUpResponder {
730    type ControlHandle = SpeedtestControlHandle;
731
732    fn control_handle(&self) -> &SpeedtestControlHandle {
733        &self.control_handle
734    }
735
736    fn drop_without_shutdown(mut self) {
737        // Safety: drops once, never accessed again due to mem::forget
738        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
739        // Prevent Drop from running (which would shut down the channel)
740        std::mem::forget(self);
741    }
742}
743
744impl SpeedtestSocketUpResponder {
745    /// Sends a response to the FIDL transaction.
746    ///
747    /// Sets the channel to shutdown if an error occurs.
748    pub fn send(self, mut payload: &TransferReport) -> Result<(), fidl::Error> {
749        let _result = self.send_raw(payload);
750        if _result.is_err() {
751            self.control_handle.shutdown();
752        }
753        self.drop_without_shutdown();
754        _result
755    }
756
757    /// Similar to "send" but does not shutdown the channel if an error occurs.
758    pub fn send_no_shutdown_on_err(self, mut payload: &TransferReport) -> Result<(), fidl::Error> {
759        let _result = self.send_raw(payload);
760        self.drop_without_shutdown();
761        _result
762    }
763
764    fn send_raw(&self, mut payload: &TransferReport) -> Result<(), fidl::Error> {
765        self.control_handle.inner.send::<fidl::encoding::FlexibleType<TransferReport>>(
766            fidl::encoding::Flexible::new(payload),
767            self.tx_id,
768            0x7c530a369209ae87,
769            fidl::encoding::DynamicFlags::FLEXIBLE,
770        )
771    }
772}
773
774#[must_use = "FIDL methods require a response to be sent"]
775#[derive(Debug)]
776pub struct SpeedtestSocketDownResponder {
777    control_handle: std::mem::ManuallyDrop<SpeedtestControlHandle>,
778    tx_id: u32,
779}
780
781/// Set the the channel to be shutdown (see [`SpeedtestControlHandle::shutdown`])
782/// if the responder is dropped without sending a response, so that the client
783/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
784impl std::ops::Drop for SpeedtestSocketDownResponder {
785    fn drop(&mut self) {
786        self.control_handle.shutdown();
787        // Safety: drops once, never accessed again
788        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
789    }
790}
791
792impl fidl::endpoints::Responder for SpeedtestSocketDownResponder {
793    type ControlHandle = SpeedtestControlHandle;
794
795    fn control_handle(&self) -> &SpeedtestControlHandle {
796        &self.control_handle
797    }
798
799    fn drop_without_shutdown(mut self) {
800        // Safety: drops once, never accessed again due to mem::forget
801        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
802        // Prevent Drop from running (which would shut down the channel)
803        std::mem::forget(self);
804    }
805}
806
807impl SpeedtestSocketDownResponder {
808    /// Sends a response to the FIDL transaction.
809    ///
810    /// Sets the channel to shutdown if an error occurs.
811    pub fn send(self, mut payload: &TransferReport) -> Result<(), fidl::Error> {
812        let _result = self.send_raw(payload);
813        if _result.is_err() {
814            self.control_handle.shutdown();
815        }
816        self.drop_without_shutdown();
817        _result
818    }
819
820    /// Similar to "send" but does not shutdown the channel if an error occurs.
821    pub fn send_no_shutdown_on_err(self, mut payload: &TransferReport) -> Result<(), fidl::Error> {
822        let _result = self.send_raw(payload);
823        self.drop_without_shutdown();
824        _result
825    }
826
827    fn send_raw(&self, mut payload: &TransferReport) -> Result<(), fidl::Error> {
828        self.control_handle.inner.send::<fidl::encoding::FlexibleType<TransferReport>>(
829            fidl::encoding::Flexible::new(payload),
830            self.tx_id,
831            0x426e13de44070751,
832            fidl::encoding::DynamicFlags::FLEXIBLE,
833        )
834    }
835}
836
837mod internal {
838    use super::*;
839
840    impl fidl::encoding::ResourceTypeMarker for SpeedtestSocketDownRequest {
841        type Borrowed<'a> = &'a mut Self;
842        fn take_or_borrow<'a>(
843            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
844        ) -> Self::Borrowed<'a> {
845            value
846        }
847    }
848
849    unsafe impl fidl::encoding::TypeMarker for SpeedtestSocketDownRequest {
850        type Owned = Self;
851
852        #[inline(always)]
853        fn inline_align(_context: fidl::encoding::Context) -> usize {
854            8
855        }
856
857        #[inline(always)]
858        fn inline_size(_context: fidl::encoding::Context) -> usize {
859            24
860        }
861    }
862
863    unsafe impl
864        fidl::encoding::Encode<
865            SpeedtestSocketDownRequest,
866            fidl::encoding::DefaultFuchsiaResourceDialect,
867        > for &mut SpeedtestSocketDownRequest
868    {
869        #[inline]
870        unsafe fn encode(
871            self,
872            encoder: &mut fidl::encoding::Encoder<
873                '_,
874                fidl::encoding::DefaultFuchsiaResourceDialect,
875            >,
876            offset: usize,
877            _depth: fidl::encoding::Depth,
878        ) -> fidl::Result<()> {
879            encoder.debug_check_bounds::<SpeedtestSocketDownRequest>(offset);
880            // Delegate to tuple encoding.
881            fidl::encoding::Encode::<
882                SpeedtestSocketDownRequest,
883                fidl::encoding::DefaultFuchsiaResourceDialect,
884            >::encode(
885                (
886                    <fidl::encoding::HandleType<
887                        fidl::Socket,
888                        { fidl::ObjectType::SOCKET.into_raw() },
889                        16388,
890                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
891                        &mut self.socket
892                    ),
893                    <TransferParams as fidl::encoding::ValueTypeMarker>::borrow(&self.params),
894                ),
895                encoder,
896                offset,
897                _depth,
898            )
899        }
900    }
901    unsafe impl<
902            T0: fidl::encoding::Encode<
903                fidl::encoding::HandleType<
904                    fidl::Socket,
905                    { fidl::ObjectType::SOCKET.into_raw() },
906                    16388,
907                >,
908                fidl::encoding::DefaultFuchsiaResourceDialect,
909            >,
910            T1: fidl::encoding::Encode<TransferParams, fidl::encoding::DefaultFuchsiaResourceDialect>,
911        >
912        fidl::encoding::Encode<
913            SpeedtestSocketDownRequest,
914            fidl::encoding::DefaultFuchsiaResourceDialect,
915        > for (T0, T1)
916    {
917        #[inline]
918        unsafe fn encode(
919            self,
920            encoder: &mut fidl::encoding::Encoder<
921                '_,
922                fidl::encoding::DefaultFuchsiaResourceDialect,
923            >,
924            offset: usize,
925            depth: fidl::encoding::Depth,
926        ) -> fidl::Result<()> {
927            encoder.debug_check_bounds::<SpeedtestSocketDownRequest>(offset);
928            // Zero out padding regions. There's no need to apply masks
929            // because the unmasked parts will be overwritten by fields.
930            unsafe {
931                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
932                (ptr as *mut u64).write_unaligned(0);
933            }
934            // Write the fields.
935            self.0.encode(encoder, offset + 0, depth)?;
936            self.1.encode(encoder, offset + 8, depth)?;
937            Ok(())
938        }
939    }
940
941    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
942        for SpeedtestSocketDownRequest
943    {
944        #[inline(always)]
945        fn new_empty() -> Self {
946            Self {
947                socket: fidl::new_empty!(fidl::encoding::HandleType<fidl::Socket, { fidl::ObjectType::SOCKET.into_raw() }, 16388>, fidl::encoding::DefaultFuchsiaResourceDialect),
948                params: fidl::new_empty!(
949                    TransferParams,
950                    fidl::encoding::DefaultFuchsiaResourceDialect
951                ),
952            }
953        }
954
955        #[inline]
956        unsafe fn decode(
957            &mut self,
958            decoder: &mut fidl::encoding::Decoder<
959                '_,
960                fidl::encoding::DefaultFuchsiaResourceDialect,
961            >,
962            offset: usize,
963            _depth: fidl::encoding::Depth,
964        ) -> fidl::Result<()> {
965            decoder.debug_check_bounds::<Self>(offset);
966            // Verify that padding bytes are zero.
967            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
968            let padval = unsafe { (ptr as *const u64).read_unaligned() };
969            let mask = 0xffffffff00000000u64;
970            let maskedval = padval & mask;
971            if maskedval != 0 {
972                return Err(fidl::Error::NonZeroPadding {
973                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
974                });
975            }
976            fidl::decode!(fidl::encoding::HandleType<fidl::Socket, { fidl::ObjectType::SOCKET.into_raw() }, 16388>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.socket, decoder, offset + 0, _depth)?;
977            fidl::decode!(
978                TransferParams,
979                fidl::encoding::DefaultFuchsiaResourceDialect,
980                &mut self.params,
981                decoder,
982                offset + 8,
983                _depth
984            )?;
985            Ok(())
986        }
987    }
988
989    impl fidl::encoding::ResourceTypeMarker for SpeedtestSocketUpRequest {
990        type Borrowed<'a> = &'a mut Self;
991        fn take_or_borrow<'a>(
992            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
993        ) -> Self::Borrowed<'a> {
994            value
995        }
996    }
997
998    unsafe impl fidl::encoding::TypeMarker for SpeedtestSocketUpRequest {
999        type Owned = Self;
1000
1001        #[inline(always)]
1002        fn inline_align(_context: fidl::encoding::Context) -> usize {
1003            8
1004        }
1005
1006        #[inline(always)]
1007        fn inline_size(_context: fidl::encoding::Context) -> usize {
1008            24
1009        }
1010    }
1011
1012    unsafe impl
1013        fidl::encoding::Encode<
1014            SpeedtestSocketUpRequest,
1015            fidl::encoding::DefaultFuchsiaResourceDialect,
1016        > for &mut SpeedtestSocketUpRequest
1017    {
1018        #[inline]
1019        unsafe fn encode(
1020            self,
1021            encoder: &mut fidl::encoding::Encoder<
1022                '_,
1023                fidl::encoding::DefaultFuchsiaResourceDialect,
1024            >,
1025            offset: usize,
1026            _depth: fidl::encoding::Depth,
1027        ) -> fidl::Result<()> {
1028            encoder.debug_check_bounds::<SpeedtestSocketUpRequest>(offset);
1029            // Delegate to tuple encoding.
1030            fidl::encoding::Encode::<
1031                SpeedtestSocketUpRequest,
1032                fidl::encoding::DefaultFuchsiaResourceDialect,
1033            >::encode(
1034                (
1035                    <fidl::encoding::HandleType<
1036                        fidl::Socket,
1037                        { fidl::ObjectType::SOCKET.into_raw() },
1038                        16392,
1039                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1040                        &mut self.socket
1041                    ),
1042                    <TransferParams as fidl::encoding::ValueTypeMarker>::borrow(&self.params),
1043                ),
1044                encoder,
1045                offset,
1046                _depth,
1047            )
1048        }
1049    }
1050    unsafe impl<
1051            T0: fidl::encoding::Encode<
1052                fidl::encoding::HandleType<
1053                    fidl::Socket,
1054                    { fidl::ObjectType::SOCKET.into_raw() },
1055                    16392,
1056                >,
1057                fidl::encoding::DefaultFuchsiaResourceDialect,
1058            >,
1059            T1: fidl::encoding::Encode<TransferParams, fidl::encoding::DefaultFuchsiaResourceDialect>,
1060        >
1061        fidl::encoding::Encode<
1062            SpeedtestSocketUpRequest,
1063            fidl::encoding::DefaultFuchsiaResourceDialect,
1064        > for (T0, T1)
1065    {
1066        #[inline]
1067        unsafe fn encode(
1068            self,
1069            encoder: &mut fidl::encoding::Encoder<
1070                '_,
1071                fidl::encoding::DefaultFuchsiaResourceDialect,
1072            >,
1073            offset: usize,
1074            depth: fidl::encoding::Depth,
1075        ) -> fidl::Result<()> {
1076            encoder.debug_check_bounds::<SpeedtestSocketUpRequest>(offset);
1077            // Zero out padding regions. There's no need to apply masks
1078            // because the unmasked parts will be overwritten by fields.
1079            unsafe {
1080                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1081                (ptr as *mut u64).write_unaligned(0);
1082            }
1083            // Write the fields.
1084            self.0.encode(encoder, offset + 0, depth)?;
1085            self.1.encode(encoder, offset + 8, depth)?;
1086            Ok(())
1087        }
1088    }
1089
1090    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1091        for SpeedtestSocketUpRequest
1092    {
1093        #[inline(always)]
1094        fn new_empty() -> Self {
1095            Self {
1096                socket: fidl::new_empty!(fidl::encoding::HandleType<fidl::Socket, { fidl::ObjectType::SOCKET.into_raw() }, 16392>, fidl::encoding::DefaultFuchsiaResourceDialect),
1097                params: fidl::new_empty!(
1098                    TransferParams,
1099                    fidl::encoding::DefaultFuchsiaResourceDialect
1100                ),
1101            }
1102        }
1103
1104        #[inline]
1105        unsafe fn decode(
1106            &mut self,
1107            decoder: &mut fidl::encoding::Decoder<
1108                '_,
1109                fidl::encoding::DefaultFuchsiaResourceDialect,
1110            >,
1111            offset: usize,
1112            _depth: fidl::encoding::Depth,
1113        ) -> fidl::Result<()> {
1114            decoder.debug_check_bounds::<Self>(offset);
1115            // Verify that padding bytes are zero.
1116            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
1117            let padval = unsafe { (ptr as *const u64).read_unaligned() };
1118            let mask = 0xffffffff00000000u64;
1119            let maskedval = padval & mask;
1120            if maskedval != 0 {
1121                return Err(fidl::Error::NonZeroPadding {
1122                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1123                });
1124            }
1125            fidl::decode!(fidl::encoding::HandleType<fidl::Socket, { fidl::ObjectType::SOCKET.into_raw() }, 16392>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.socket, decoder, offset + 0, _depth)?;
1126            fidl::decode!(
1127                TransferParams,
1128                fidl::encoding::DefaultFuchsiaResourceDialect,
1129                &mut self.params,
1130                decoder,
1131                offset + 8,
1132                _depth
1133            )?;
1134            Ok(())
1135        }
1136    }
1137}