fidl_fuchsia_component_runner/
fidl_fuchsia_component_runner.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_component_runner__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct ComponentControllerOnPublishDiagnosticsRequest {
16    pub payload: ComponentDiagnostics,
17}
18
19impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
20    for ComponentControllerOnPublishDiagnosticsRequest
21{
22}
23
24#[derive(Debug, PartialEq)]
25pub struct ComponentRunnerStartRequest {
26    pub start_info: ComponentStartInfo,
27    pub controller: fidl::endpoints::ServerEnd<ComponentControllerMarker>,
28}
29
30impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
31    for ComponentRunnerStartRequest
32{
33}
34
35#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
36pub struct TaskProviderGetJobResponse {
37    pub job: fidl::Job,
38}
39
40impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
41    for TaskProviderGetJobResponse
42{
43}
44
45#[derive(Debug, Default, PartialEq)]
46pub struct ComponentControllerOnEscrowRequest {
47    /// Escrow the outgoing directory server endpoint. Whenever the
48    /// component is started, the framework will return this channel via
49    /// [`ComponentStartInfo.outgoing_dir`].
50    pub outgoing_dir: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>>,
51    /// Escrow some user defined state. Whenever the component is started,
52    /// the framework will return these handles via
53    /// [`ComponentStartInfo.escrowed_dictionary`].
54    ///
55    /// The framework will not wait for any signals on these objects.
56    ///
57    /// ## Example
58    ///
59    /// Let's say a component needs to escrow an event pair that represents
60    /// the result of some expensive calculation. It can create a
61    /// dictionary, put the event pair inside with an appropriate key
62    /// (e.g. `"my_event_pair"`), then check for that entry on startup.
63    pub escrowed_dictionary: Option<fidl_fuchsia_component_sandbox::DictionaryRef>,
64    #[doc(hidden)]
65    pub __source_breaking: fidl::marker::SourceBreaking,
66}
67
68impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
69    for ComponentControllerOnEscrowRequest
70{
71}
72
73#[derive(Debug, Default, PartialEq)]
74pub struct ComponentDiagnostics {
75    pub tasks: Option<ComponentTasks>,
76    #[doc(hidden)]
77    pub __source_breaking: fidl::marker::SourceBreaking,
78}
79
80impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ComponentDiagnostics {}
81
82/// A single component namespace entry, which describes a namespace mount point
83/// (`path`) and the directory backing it (`directory`). This type is usually
84/// composed inside a vector.  See `ComponentStartInfo.ns` for more details.
85#[derive(Debug, Default, PartialEq)]
86pub struct ComponentNamespaceEntry {
87    /// The mount point for the directory, including a
88    /// leading slash. For example: "/pkg", "/svc", or "/config/data".
89    pub path: Option<String>,
90    /// The directory mounted at the above `path`.
91    pub directory: Option<fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>>,
92    #[doc(hidden)]
93    pub __source_breaking: fidl::marker::SourceBreaking,
94}
95
96impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ComponentNamespaceEntry {}
97
98/// Parameters for starting a new component instance.
99#[derive(Debug, Default, PartialEq)]
100pub struct ComponentStartInfo {
101    /// The resolved URL of the component.
102    ///
103    /// This is the canonical URL obtained by the component resolver after
104    /// following redirects and resolving relative paths.
105    pub resolved_url: Option<String>,
106    /// The component's program declaration.
107    /// This information originates from `ComponentDecl.program`.
108    pub program: Option<fidl_fuchsia_data::Dictionary>,
109    /// The namespace to provide to the component instance.
110    ///
111    /// A namespace specifies the set of directories that a component instance
112    /// receives at start-up. Through the namespace directories, a component
113    /// may access capabilities available to it. The contents of the namespace
114    /// are mainly determined by the component's `use` declarations but may
115    /// also contain additional capabilities automatically provided by the
116    /// framework.
117    ///
118    /// By convention, a component's namespace typically contains some or all
119    /// of the following directories:
120    ///
121    /// - "/svc": A directory containing services that the component requested
122    ///           to use via its "import" declarations.
123    /// - "/pkg": A directory containing the component's package, including its
124    ///           binaries, libraries, and other assets.
125    ///
126    /// The mount points specified in each entry must be unique and
127    /// non-overlapping. For example, [{"/foo", ..}, {"/foo/bar", ..}] is
128    /// invalid.
129    pub ns: Option<Vec<ComponentNamespaceEntry>>,
130    /// The directory this component serves.
131    pub outgoing_dir: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>>,
132    /// The directory served by the runner to present runtime information about
133    /// the component. The runner must either serve it, or drop it to avoid
134    /// blocking any consumers indefinitely.
135    pub runtime_dir: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>>,
136    /// The numbered handles that were passed to the component.
137    ///
138    /// If the component does not support numbered handles, the runner is expected
139    /// to close the handles.
140    pub numbered_handles: Option<Vec<fidl_fuchsia_process::HandleInfo>>,
141    /// Binary representation of the component's configuration.
142    ///
143    /// # Layout
144    ///
145    /// The first 2 bytes of the data should be interpreted as an unsigned 16-bit
146    /// little-endian integer which denotes the number of bytes following it that
147    /// contain the configuration checksum. After the checksum, all the remaining
148    /// bytes are a persistent FIDL message of a top-level struct. The struct's
149    /// fields match the configuration fields of the component's compiled manifest
150    /// in the same order.
151    pub encoded_config: Option<fidl_fuchsia_mem::Data>,
152    /// An eventpair that debuggers can use to defer the launch of the component.
153    ///
154    /// For example, ELF runners hold off from creating processes in the component
155    /// until ZX_EVENTPAIR_PEER_CLOSED is signaled on this eventpair. They also
156    /// ensure that runtime_dir is served before waiting on this eventpair.
157    /// ELF debuggers can query the runtime_dir to decide whether to attach before
158    /// they drop the other side of the eventpair, which is sent in the payload of
159    /// the DebugStarted event in fuchsia.component.events.
160    pub break_on_start: Option<fidl::EventPair>,
161    /// An opaque token that represents the component instance.
162    ///
163    /// The `fuchsia.component/Introspector` protocol may be used to get the
164    /// string moniker of the instance from this token.
165    ///
166    /// Runners may publish this token as part of diagnostics information, to
167    /// identify the running component without knowing its moniker.
168    ///
169    /// The token is invalidated when the component instance is destroyed.
170    pub component_instance: Option<fidl::Event>,
171    /// A dictionary containing data and handles that the component has escrowed
172    /// during its previous execution via [`ComponentController.OnEscrow`].
173    pub escrowed_dictionary: Option<fidl_fuchsia_component_sandbox::DictionaryRef>,
174    #[doc(hidden)]
175    pub __source_breaking: fidl::marker::SourceBreaking,
176}
177
178impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ComponentStartInfo {}
179
180#[derive(Debug, Default, PartialEq)]
181pub struct ComponentStopInfo {
182    /// The component's termination status, as documented on [ComponentRunner] above.
183    ///
184    /// The caller should set this field. If it is absent, the framework will assume
185    /// a value of ZX_OK.
186    pub termination_status: Option<i32>,
187    /// (Optional) The exit code of the component instance.
188    ///
189    /// Runner implementors may map their runtime specific exit code concept
190    /// (such as libc exit status) to this field. Or they may choose to
191    /// leave this blank.
192    pub exit_code: Option<i64>,
193    #[doc(hidden)]
194    pub __source_breaking: fidl::marker::SourceBreaking,
195}
196
197impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ComponentStopInfo {}
198
199#[derive(Debug, Default, PartialEq)]
200pub struct ComponentTasks {
201    pub component_task: Option<Task>,
202    pub parent_task: Option<Task>,
203    #[doc(hidden)]
204    pub __source_breaking: fidl::marker::SourceBreaking,
205}
206
207impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ComponentTasks {}
208
209#[derive(Debug)]
210pub enum Task {
211    Job(fidl::Job),
212    Process(fidl::Process),
213    Thread(fidl::Thread),
214    #[doc(hidden)]
215    __SourceBreaking {
216        unknown_ordinal: u64,
217    },
218}
219
220/// Pattern that matches an unknown `Task` member.
221#[macro_export]
222macro_rules! TaskUnknown {
223    () => {
224        _
225    };
226}
227
228// Custom PartialEq so that unknown variants are not equal to themselves.
229impl PartialEq for Task {
230    fn eq(&self, other: &Self) -> bool {
231        match (self, other) {
232            (Self::Job(x), Self::Job(y)) => *x == *y,
233            (Self::Process(x), Self::Process(y)) => *x == *y,
234            (Self::Thread(x), Self::Thread(y)) => *x == *y,
235            _ => false,
236        }
237    }
238}
239
240impl Task {
241    #[inline]
242    pub fn ordinal(&self) -> u64 {
243        match *self {
244            Self::Job(_) => 1,
245            Self::Process(_) => 2,
246            Self::Thread(_) => 3,
247            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
248        }
249    }
250
251    #[inline]
252    pub fn unknown_variant_for_testing() -> Self {
253        Self::__SourceBreaking { unknown_ordinal: 0 }
254    }
255
256    #[inline]
257    pub fn is_unknown(&self) -> bool {
258        match self {
259            Self::__SourceBreaking { .. } => true,
260            _ => false,
261        }
262    }
263}
264
265impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Task {}
266
267#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
268pub struct ComponentControllerMarker;
269
270impl fidl::endpoints::ProtocolMarker for ComponentControllerMarker {
271    type Proxy = ComponentControllerProxy;
272    type RequestStream = ComponentControllerRequestStream;
273    #[cfg(target_os = "fuchsia")]
274    type SynchronousProxy = ComponentControllerSynchronousProxy;
275
276    const DEBUG_NAME: &'static str = "(anonymous) ComponentController";
277}
278
279pub trait ComponentControllerProxyInterface: Send + Sync {
280    fn r#stop(&self) -> Result<(), fidl::Error>;
281    fn r#kill(&self) -> Result<(), fidl::Error>;
282}
283#[derive(Debug)]
284#[cfg(target_os = "fuchsia")]
285pub struct ComponentControllerSynchronousProxy {
286    client: fidl::client::sync::Client,
287}
288
289#[cfg(target_os = "fuchsia")]
290impl fidl::endpoints::SynchronousProxy for ComponentControllerSynchronousProxy {
291    type Proxy = ComponentControllerProxy;
292    type Protocol = ComponentControllerMarker;
293
294    fn from_channel(inner: fidl::Channel) -> Self {
295        Self::new(inner)
296    }
297
298    fn into_channel(self) -> fidl::Channel {
299        self.client.into_channel()
300    }
301
302    fn as_channel(&self) -> &fidl::Channel {
303        self.client.as_channel()
304    }
305}
306
307#[cfg(target_os = "fuchsia")]
308impl ComponentControllerSynchronousProxy {
309    pub fn new(channel: fidl::Channel) -> Self {
310        let protocol_name =
311            <ComponentControllerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
312        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
313    }
314
315    pub fn into_channel(self) -> fidl::Channel {
316        self.client.into_channel()
317    }
318
319    /// Waits until an event arrives and returns it. It is safe for other
320    /// threads to make concurrent requests while waiting for an event.
321    pub fn wait_for_event(
322        &self,
323        deadline: zx::MonotonicInstant,
324    ) -> Result<ComponentControllerEvent, fidl::Error> {
325        ComponentControllerEvent::decode(self.client.wait_for_event(deadline)?)
326    }
327
328    /// Request to stop the component instance.
329    ///
330    /// After stopping the component instance, the server should close this
331    /// connection with an epitaph. After the connection
332    /// closes, component manager considers this component instance to be
333    /// Stopped and the component's namespace will be torn down.
334    pub fn r#stop(&self) -> Result<(), fidl::Error> {
335        self.client.send::<fidl::encoding::EmptyPayload>(
336            (),
337            0x42ad097fa07c1b62,
338            fidl::encoding::DynamicFlags::empty(),
339        )
340    }
341
342    /// Stop this component instance immediately.
343    ///
344    /// The ComponentRunner must immediately kill the component instance, and
345    /// then close this connection with an epitaph. After the connection
346    /// closes, component manager considers this component instance to be
347    /// Stopped and the component's namespace will be torn down.
348    ///
349    /// In some cases Kill() may be issued before Stop(), but that is not
350    /// guaranteed.
351    pub fn r#kill(&self) -> Result<(), fidl::Error> {
352        self.client.send::<fidl::encoding::EmptyPayload>(
353            (),
354            0x3ea62e200a45aeb4,
355            fidl::encoding::DynamicFlags::empty(),
356        )
357    }
358}
359
360#[cfg(target_os = "fuchsia")]
361impl From<ComponentControllerSynchronousProxy> for zx::Handle {
362    fn from(value: ComponentControllerSynchronousProxy) -> Self {
363        value.into_channel().into()
364    }
365}
366
367#[cfg(target_os = "fuchsia")]
368impl From<fidl::Channel> for ComponentControllerSynchronousProxy {
369    fn from(value: fidl::Channel) -> Self {
370        Self::new(value)
371    }
372}
373
374#[cfg(target_os = "fuchsia")]
375impl fidl::endpoints::FromClient for ComponentControllerSynchronousProxy {
376    type Protocol = ComponentControllerMarker;
377
378    fn from_client(value: fidl::endpoints::ClientEnd<ComponentControllerMarker>) -> Self {
379        Self::new(value.into_channel())
380    }
381}
382
383#[derive(Debug, Clone)]
384pub struct ComponentControllerProxy {
385    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
386}
387
388impl fidl::endpoints::Proxy for ComponentControllerProxy {
389    type Protocol = ComponentControllerMarker;
390
391    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
392        Self::new(inner)
393    }
394
395    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
396        self.client.into_channel().map_err(|client| Self { client })
397    }
398
399    fn as_channel(&self) -> &::fidl::AsyncChannel {
400        self.client.as_channel()
401    }
402}
403
404impl ComponentControllerProxy {
405    /// Create a new Proxy for fuchsia.component.runner/ComponentController.
406    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
407        let protocol_name =
408            <ComponentControllerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
409        Self { client: fidl::client::Client::new(channel, protocol_name) }
410    }
411
412    /// Get a Stream of events from the remote end of the protocol.
413    ///
414    /// # Panics
415    ///
416    /// Panics if the event stream was already taken.
417    pub fn take_event_stream(&self) -> ComponentControllerEventStream {
418        ComponentControllerEventStream { event_receiver: self.client.take_event_receiver() }
419    }
420
421    /// Request to stop the component instance.
422    ///
423    /// After stopping the component instance, the server should close this
424    /// connection with an epitaph. After the connection
425    /// closes, component manager considers this component instance to be
426    /// Stopped and the component's namespace will be torn down.
427    pub fn r#stop(&self) -> Result<(), fidl::Error> {
428        ComponentControllerProxyInterface::r#stop(self)
429    }
430
431    /// Stop this component instance immediately.
432    ///
433    /// The ComponentRunner must immediately kill the component instance, and
434    /// then close this connection with an epitaph. After the connection
435    /// closes, component manager considers this component instance to be
436    /// Stopped and the component's namespace will be torn down.
437    ///
438    /// In some cases Kill() may be issued before Stop(), but that is not
439    /// guaranteed.
440    pub fn r#kill(&self) -> Result<(), fidl::Error> {
441        ComponentControllerProxyInterface::r#kill(self)
442    }
443}
444
445impl ComponentControllerProxyInterface for ComponentControllerProxy {
446    fn r#stop(&self) -> Result<(), fidl::Error> {
447        self.client.send::<fidl::encoding::EmptyPayload>(
448            (),
449            0x42ad097fa07c1b62,
450            fidl::encoding::DynamicFlags::empty(),
451        )
452    }
453
454    fn r#kill(&self) -> Result<(), fidl::Error> {
455        self.client.send::<fidl::encoding::EmptyPayload>(
456            (),
457            0x3ea62e200a45aeb4,
458            fidl::encoding::DynamicFlags::empty(),
459        )
460    }
461}
462
463pub struct ComponentControllerEventStream {
464    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
465}
466
467impl std::marker::Unpin for ComponentControllerEventStream {}
468
469impl futures::stream::FusedStream for ComponentControllerEventStream {
470    fn is_terminated(&self) -> bool {
471        self.event_receiver.is_terminated()
472    }
473}
474
475impl futures::Stream for ComponentControllerEventStream {
476    type Item = Result<ComponentControllerEvent, fidl::Error>;
477
478    fn poll_next(
479        mut self: std::pin::Pin<&mut Self>,
480        cx: &mut std::task::Context<'_>,
481    ) -> std::task::Poll<Option<Self::Item>> {
482        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
483            &mut self.event_receiver,
484            cx
485        )?) {
486            Some(buf) => std::task::Poll::Ready(Some(ComponentControllerEvent::decode(buf))),
487            None => std::task::Poll::Ready(None),
488        }
489    }
490}
491
492#[derive(Debug)]
493pub enum ComponentControllerEvent {
494    OnPublishDiagnostics {
495        payload: ComponentDiagnostics,
496    },
497    OnEscrow {
498        payload: ComponentControllerOnEscrowRequest,
499    },
500    OnStop {
501        payload: ComponentStopInfo,
502    },
503    #[non_exhaustive]
504    _UnknownEvent {
505        /// Ordinal of the event that was sent.
506        ordinal: u64,
507    },
508}
509
510impl ComponentControllerEvent {
511    #[allow(irrefutable_let_patterns)]
512    pub fn into_on_publish_diagnostics(self) -> Option<ComponentDiagnostics> {
513        if let ComponentControllerEvent::OnPublishDiagnostics { payload } = self {
514            Some((payload))
515        } else {
516            None
517        }
518    }
519    #[allow(irrefutable_let_patterns)]
520    pub fn into_on_escrow(self) -> Option<ComponentControllerOnEscrowRequest> {
521        if let ComponentControllerEvent::OnEscrow { payload } = self {
522            Some((payload))
523        } else {
524            None
525        }
526    }
527    #[allow(irrefutable_let_patterns)]
528    pub fn into_on_stop(self) -> Option<ComponentStopInfo> {
529        if let ComponentControllerEvent::OnStop { payload } = self {
530            Some((payload))
531        } else {
532            None
533        }
534    }
535
536    /// Decodes a message buffer as a [`ComponentControllerEvent`].
537    fn decode(
538        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
539    ) -> Result<ComponentControllerEvent, fidl::Error> {
540        let (bytes, _handles) = buf.split_mut();
541        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
542        debug_assert_eq!(tx_header.tx_id, 0);
543        match tx_header.ordinal {
544            0x1f16d8c3c49c6947 => {
545                let mut out = fidl::new_empty!(
546                    ComponentControllerOnPublishDiagnosticsRequest,
547                    fidl::encoding::DefaultFuchsiaResourceDialect
548                );
549                fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ComponentControllerOnPublishDiagnosticsRequest>(&tx_header, _body_bytes, _handles, &mut out)?;
550                Ok((ComponentControllerEvent::OnPublishDiagnostics { payload: out.payload }))
551            }
552            0xa231349355343fc => {
553                let mut out = fidl::new_empty!(
554                    ComponentControllerOnEscrowRequest,
555                    fidl::encoding::DefaultFuchsiaResourceDialect
556                );
557                fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ComponentControllerOnEscrowRequest>(&tx_header, _body_bytes, _handles, &mut out)?;
558                Ok((ComponentControllerEvent::OnEscrow { payload: out }))
559            }
560            0x3bfd24b031878ab2 => {
561                let mut out = fidl::new_empty!(
562                    ComponentStopInfo,
563                    fidl::encoding::DefaultFuchsiaResourceDialect
564                );
565                fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ComponentStopInfo>(&tx_header, _body_bytes, _handles, &mut out)?;
566                Ok((ComponentControllerEvent::OnStop { payload: out }))
567            }
568            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
569                Ok(ComponentControllerEvent::_UnknownEvent { ordinal: tx_header.ordinal })
570            }
571            _ => Err(fidl::Error::UnknownOrdinal {
572                ordinal: tx_header.ordinal,
573                protocol_name:
574                    <ComponentControllerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
575            }),
576        }
577    }
578}
579
580/// A Stream of incoming requests for fuchsia.component.runner/ComponentController.
581pub struct ComponentControllerRequestStream {
582    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
583    is_terminated: bool,
584}
585
586impl std::marker::Unpin for ComponentControllerRequestStream {}
587
588impl futures::stream::FusedStream for ComponentControllerRequestStream {
589    fn is_terminated(&self) -> bool {
590        self.is_terminated
591    }
592}
593
594impl fidl::endpoints::RequestStream for ComponentControllerRequestStream {
595    type Protocol = ComponentControllerMarker;
596    type ControlHandle = ComponentControllerControlHandle;
597
598    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
599        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
600    }
601
602    fn control_handle(&self) -> Self::ControlHandle {
603        ComponentControllerControlHandle { inner: self.inner.clone() }
604    }
605
606    fn into_inner(
607        self,
608    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
609    {
610        (self.inner, self.is_terminated)
611    }
612
613    fn from_inner(
614        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
615        is_terminated: bool,
616    ) -> Self {
617        Self { inner, is_terminated }
618    }
619}
620
621impl futures::Stream for ComponentControllerRequestStream {
622    type Item = Result<ComponentControllerRequest, fidl::Error>;
623
624    fn poll_next(
625        mut self: std::pin::Pin<&mut Self>,
626        cx: &mut std::task::Context<'_>,
627    ) -> std::task::Poll<Option<Self::Item>> {
628        let this = &mut *self;
629        if this.inner.check_shutdown(cx) {
630            this.is_terminated = true;
631            return std::task::Poll::Ready(None);
632        }
633        if this.is_terminated {
634            panic!("polled ComponentControllerRequestStream after completion");
635        }
636        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
637            |bytes, handles| {
638                match this.inner.channel().read_etc(cx, bytes, handles) {
639                    std::task::Poll::Ready(Ok(())) => {}
640                    std::task::Poll::Pending => return std::task::Poll::Pending,
641                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
642                        this.is_terminated = true;
643                        return std::task::Poll::Ready(None);
644                    }
645                    std::task::Poll::Ready(Err(e)) => {
646                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
647                            e.into(),
648                        ))))
649                    }
650                }
651
652                // A message has been received from the channel
653                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
654
655                std::task::Poll::Ready(Some(match header.ordinal {
656                0x42ad097fa07c1b62 => {
657                    header.validate_request_tx_id(fidl::MethodType::OneWay)?;
658                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fidl::encoding::DefaultFuchsiaResourceDialect);
659                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
660                    let control_handle = ComponentControllerControlHandle {
661                        inner: this.inner.clone(),
662                    };
663                    Ok(ComponentControllerRequest::Stop {
664                        control_handle,
665                    })
666                }
667                0x3ea62e200a45aeb4 => {
668                    header.validate_request_tx_id(fidl::MethodType::OneWay)?;
669                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fidl::encoding::DefaultFuchsiaResourceDialect);
670                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
671                    let control_handle = ComponentControllerControlHandle {
672                        inner: this.inner.clone(),
673                    };
674                    Ok(ComponentControllerRequest::Kill {
675                        control_handle,
676                    })
677                }
678                _ if header.tx_id == 0 && header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
679                    Ok(ComponentControllerRequest::_UnknownMethod {
680                        ordinal: header.ordinal,
681                        control_handle: ComponentControllerControlHandle { inner: this.inner.clone() },
682                        method_type: fidl::MethodType::OneWay,
683                    })
684                }
685                _ if header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
686                    this.inner.send_framework_err(
687                        fidl::encoding::FrameworkErr::UnknownMethod,
688                        header.tx_id,
689                        header.ordinal,
690                        header.dynamic_flags(),
691                        (bytes, handles),
692                    )?;
693                    Ok(ComponentControllerRequest::_UnknownMethod {
694                        ordinal: header.ordinal,
695                        control_handle: ComponentControllerControlHandle { inner: this.inner.clone() },
696                        method_type: fidl::MethodType::TwoWay,
697                    })
698                }
699                _ => Err(fidl::Error::UnknownOrdinal {
700                    ordinal: header.ordinal,
701                    protocol_name: <ComponentControllerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
702                }),
703            }))
704            },
705        )
706    }
707}
708
709/// A protocol for binding and controlling the lifetime of a component instance
710/// started using `ComponentRunner.Start()`. The component manager is the
711/// intended direct client of this protocol.
712///
713/// When the controlled component instance terminates or becomes inaccessible
714/// for any reason, the server closes the connection with an epitaph.
715///
716/// # Lifecycle
717///
718/// A component may exist in one of two states: `Started`, or `Stopped`. The
719/// component is `Started` from the time `ComponentRunner.Start()` is called
720/// until the ComponentRunner closes the ComponentController handle. The
721/// component then transitions to `Stopped`.
722///
723/// Component manager uses ComponentController to terminate a component in two
724/// steps:
725///
726/// 1.  Component manager calls `Stop()` to indicate that the ComponentRunner
727///     should stop a component's execution and send the `OnStop` event.
728/// 2.  If after some time the ComponentController is not closed, component
729///     manager calls `Kill()` to indicate that the ComponentRunner must halt a
730///     component's execution immediately, and then send the `OnStop` event.
731///     The component manager may wait some period of time after calling `Kill()`
732///     before sending `OnStop`, but makes no guarantees it will wait or for how long.
733///
734/// Component manager first waits for the ComponentController to close, and
735/// then tears down the namespace it hosts for the stopped component. Component
736/// manager may call `Kill()` without first having called `Stop()`.
737///
738/// Before stopping, a component can optionally use `OnEscrow` to store some
739/// state in the framework, to receive those state again the next time it is
740/// started.
741///
742/// When the component stops, the runner should send an `OnStop` event
743/// instead of just closing the channel, to report the component's termination status
744/// (see below) and (optionally) an exit code. Once the runner has sent `OnStop`
745/// it is free to close [ComponentRunner]; the component framework will close
746/// its end of the channel when it receives this event.
747///
748/// ## Legacy
749///
750/// Instead of sending `OnStop`, it is also legal for a runner to close the channel
751/// with with an epitaph equal to the termination status, but this is a legacy method
752/// for backward compatibility that's no longer recommended.
753///
754/// # Termination status
755///
756/// The termination status indicates the component's final disposition in the eyes of
757/// the runner.
758///
759/// Note that termination status is _not_ synonymous with a component's exit code.
760/// A component's exit code, which is optional for a runner to report, is an
761/// integer that represents the program's own return code. For example, for ELF
762/// components, it is the value returned by main(). The termination status is
763/// the _runner_'s status code for the component's termination, which may capture
764/// failure modes that occur in the context of the runner itself rather than the
765/// program.
766///
767/// The following termination statuses may be sent by the server on error:
768///
769/// - `ZX_OK`: The component exited successfully, typically because the
770///   component was asked to stop or it decided independently to exit.
771/// - `INVALID_ARGUMENTS`:
772///     * `start_info.resolved_url` is not supported by this
773///       runner;
774///     * `start_info` contains missing or invalid arguments.
775/// - `INSTANCE_CANNOT_START`: The runner could not start the component.
776///   For example, a critical part of the program could not be found or
777///   loaded, or the referenced binary was invalid for this runner.
778/// - `RESOURCE_UNAVAILABLE`: The component could not be launched due to
779///   lack of resources.
780/// - `INTERNAL`: An unexpected internal runner error was encountered.
781/// - `INSTANCE_DIED`: The component instance was started but
782///   subsequently terminated with an error.
783/// - Other status codes (e.g. `ZX_ERR_PEER_CLOSED`) may indicate a failure
784///   of the component runner itself. The component manager may respond to such
785///   failures by terminating the component runner's job to ensure system
786///   stability.
787#[derive(Debug)]
788pub enum ComponentControllerRequest {
789    /// Request to stop the component instance.
790    ///
791    /// After stopping the component instance, the server should close this
792    /// connection with an epitaph. After the connection
793    /// closes, component manager considers this component instance to be
794    /// Stopped and the component's namespace will be torn down.
795    Stop { control_handle: ComponentControllerControlHandle },
796    /// Stop this component instance immediately.
797    ///
798    /// The ComponentRunner must immediately kill the component instance, and
799    /// then close this connection with an epitaph. After the connection
800    /// closes, component manager considers this component instance to be
801    /// Stopped and the component's namespace will be torn down.
802    ///
803    /// In some cases Kill() may be issued before Stop(), but that is not
804    /// guaranteed.
805    Kill { control_handle: ComponentControllerControlHandle },
806    /// An interaction was received which does not match any known method.
807    #[non_exhaustive]
808    _UnknownMethod {
809        /// Ordinal of the method that was called.
810        ordinal: u64,
811        control_handle: ComponentControllerControlHandle,
812        method_type: fidl::MethodType,
813    },
814}
815
816impl ComponentControllerRequest {
817    #[allow(irrefutable_let_patterns)]
818    pub fn into_stop(self) -> Option<(ComponentControllerControlHandle)> {
819        if let ComponentControllerRequest::Stop { control_handle } = self {
820            Some((control_handle))
821        } else {
822            None
823        }
824    }
825
826    #[allow(irrefutable_let_patterns)]
827    pub fn into_kill(self) -> Option<(ComponentControllerControlHandle)> {
828        if let ComponentControllerRequest::Kill { control_handle } = self {
829            Some((control_handle))
830        } else {
831            None
832        }
833    }
834
835    /// Name of the method defined in FIDL
836    pub fn method_name(&self) -> &'static str {
837        match *self {
838            ComponentControllerRequest::Stop { .. } => "stop",
839            ComponentControllerRequest::Kill { .. } => "kill",
840            ComponentControllerRequest::_UnknownMethod {
841                method_type: fidl::MethodType::OneWay,
842                ..
843            } => "unknown one-way method",
844            ComponentControllerRequest::_UnknownMethod {
845                method_type: fidl::MethodType::TwoWay,
846                ..
847            } => "unknown two-way method",
848        }
849    }
850}
851
852#[derive(Debug, Clone)]
853pub struct ComponentControllerControlHandle {
854    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
855}
856
857impl fidl::endpoints::ControlHandle for ComponentControllerControlHandle {
858    fn shutdown(&self) {
859        self.inner.shutdown()
860    }
861    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
862        self.inner.shutdown_with_epitaph(status)
863    }
864
865    fn is_closed(&self) -> bool {
866        self.inner.channel().is_closed()
867    }
868    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
869        self.inner.channel().on_closed()
870    }
871
872    #[cfg(target_os = "fuchsia")]
873    fn signal_peer(
874        &self,
875        clear_mask: zx::Signals,
876        set_mask: zx::Signals,
877    ) -> Result<(), zx_status::Status> {
878        use fidl::Peered;
879        self.inner.channel().signal_peer(clear_mask, set_mask)
880    }
881}
882
883impl ComponentControllerControlHandle {
884    pub fn send_on_publish_diagnostics(
885        &self,
886        mut payload: ComponentDiagnostics,
887    ) -> Result<(), fidl::Error> {
888        self.inner.send::<ComponentControllerOnPublishDiagnosticsRequest>(
889            (&mut payload,),
890            0,
891            0x1f16d8c3c49c6947,
892            fidl::encoding::DynamicFlags::empty(),
893        )
894    }
895
896    pub fn send_on_escrow(
897        &self,
898        mut payload: ComponentControllerOnEscrowRequest,
899    ) -> Result<(), fidl::Error> {
900        self.inner.send::<ComponentControllerOnEscrowRequest>(
901            &mut payload,
902            0,
903            0xa231349355343fc,
904            fidl::encoding::DynamicFlags::FLEXIBLE,
905        )
906    }
907
908    pub fn send_on_stop(&self, mut payload: ComponentStopInfo) -> Result<(), fidl::Error> {
909        self.inner.send::<ComponentStopInfo>(
910            &mut payload,
911            0,
912            0x3bfd24b031878ab2,
913            fidl::encoding::DynamicFlags::FLEXIBLE,
914        )
915    }
916}
917
918#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
919pub struct ComponentRunnerMarker;
920
921impl fidl::endpoints::ProtocolMarker for ComponentRunnerMarker {
922    type Proxy = ComponentRunnerProxy;
923    type RequestStream = ComponentRunnerRequestStream;
924    #[cfg(target_os = "fuchsia")]
925    type SynchronousProxy = ComponentRunnerSynchronousProxy;
926
927    const DEBUG_NAME: &'static str = "fuchsia.component.runner.ComponentRunner";
928}
929impl fidl::endpoints::DiscoverableProtocolMarker for ComponentRunnerMarker {}
930
931pub trait ComponentRunnerProxyInterface: Send + Sync {
932    fn r#start(
933        &self,
934        start_info: ComponentStartInfo,
935        controller: fidl::endpoints::ServerEnd<ComponentControllerMarker>,
936    ) -> Result<(), fidl::Error>;
937}
938#[derive(Debug)]
939#[cfg(target_os = "fuchsia")]
940pub struct ComponentRunnerSynchronousProxy {
941    client: fidl::client::sync::Client,
942}
943
944#[cfg(target_os = "fuchsia")]
945impl fidl::endpoints::SynchronousProxy for ComponentRunnerSynchronousProxy {
946    type Proxy = ComponentRunnerProxy;
947    type Protocol = ComponentRunnerMarker;
948
949    fn from_channel(inner: fidl::Channel) -> Self {
950        Self::new(inner)
951    }
952
953    fn into_channel(self) -> fidl::Channel {
954        self.client.into_channel()
955    }
956
957    fn as_channel(&self) -> &fidl::Channel {
958        self.client.as_channel()
959    }
960}
961
962#[cfg(target_os = "fuchsia")]
963impl ComponentRunnerSynchronousProxy {
964    pub fn new(channel: fidl::Channel) -> Self {
965        let protocol_name = <ComponentRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
966        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
967    }
968
969    pub fn into_channel(self) -> fidl::Channel {
970        self.client.into_channel()
971    }
972
973    /// Waits until an event arrives and returns it. It is safe for other
974    /// threads to make concurrent requests while waiting for an event.
975    pub fn wait_for_event(
976        &self,
977        deadline: zx::MonotonicInstant,
978    ) -> Result<ComponentRunnerEvent, fidl::Error> {
979        ComponentRunnerEvent::decode(self.client.wait_for_event(deadline)?)
980    }
981
982    /// Start running a component instance described by `start_info`.
983    ///
984    /// Component manager binds and uses `controller` to control the
985    /// lifetime of the newly started component instance.
986    ///
987    /// Errors are delivered as epitaphs over the `ComponentController`
988    /// protocol. In the event of an error, the runner must ensure that
989    /// resources are cleaned up.
990    pub fn r#start(
991        &self,
992        mut start_info: ComponentStartInfo,
993        mut controller: fidl::endpoints::ServerEnd<ComponentControllerMarker>,
994    ) -> Result<(), fidl::Error> {
995        self.client.send::<ComponentRunnerStartRequest>(
996            (&mut start_info, controller),
997            0xad5a8c19f25ee09,
998            fidl::encoding::DynamicFlags::empty(),
999        )
1000    }
1001}
1002
1003#[cfg(target_os = "fuchsia")]
1004impl From<ComponentRunnerSynchronousProxy> for zx::Handle {
1005    fn from(value: ComponentRunnerSynchronousProxy) -> Self {
1006        value.into_channel().into()
1007    }
1008}
1009
1010#[cfg(target_os = "fuchsia")]
1011impl From<fidl::Channel> for ComponentRunnerSynchronousProxy {
1012    fn from(value: fidl::Channel) -> Self {
1013        Self::new(value)
1014    }
1015}
1016
1017#[cfg(target_os = "fuchsia")]
1018impl fidl::endpoints::FromClient for ComponentRunnerSynchronousProxy {
1019    type Protocol = ComponentRunnerMarker;
1020
1021    fn from_client(value: fidl::endpoints::ClientEnd<ComponentRunnerMarker>) -> Self {
1022        Self::new(value.into_channel())
1023    }
1024}
1025
1026#[derive(Debug, Clone)]
1027pub struct ComponentRunnerProxy {
1028    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
1029}
1030
1031impl fidl::endpoints::Proxy for ComponentRunnerProxy {
1032    type Protocol = ComponentRunnerMarker;
1033
1034    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
1035        Self::new(inner)
1036    }
1037
1038    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
1039        self.client.into_channel().map_err(|client| Self { client })
1040    }
1041
1042    fn as_channel(&self) -> &::fidl::AsyncChannel {
1043        self.client.as_channel()
1044    }
1045}
1046
1047impl ComponentRunnerProxy {
1048    /// Create a new Proxy for fuchsia.component.runner/ComponentRunner.
1049    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
1050        let protocol_name = <ComponentRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1051        Self { client: fidl::client::Client::new(channel, protocol_name) }
1052    }
1053
1054    /// Get a Stream of events from the remote end of the protocol.
1055    ///
1056    /// # Panics
1057    ///
1058    /// Panics if the event stream was already taken.
1059    pub fn take_event_stream(&self) -> ComponentRunnerEventStream {
1060        ComponentRunnerEventStream { event_receiver: self.client.take_event_receiver() }
1061    }
1062
1063    /// Start running a component instance described by `start_info`.
1064    ///
1065    /// Component manager binds and uses `controller` to control the
1066    /// lifetime of the newly started component instance.
1067    ///
1068    /// Errors are delivered as epitaphs over the `ComponentController`
1069    /// protocol. In the event of an error, the runner must ensure that
1070    /// resources are cleaned up.
1071    pub fn r#start(
1072        &self,
1073        mut start_info: ComponentStartInfo,
1074        mut controller: fidl::endpoints::ServerEnd<ComponentControllerMarker>,
1075    ) -> Result<(), fidl::Error> {
1076        ComponentRunnerProxyInterface::r#start(self, start_info, controller)
1077    }
1078}
1079
1080impl ComponentRunnerProxyInterface for ComponentRunnerProxy {
1081    fn r#start(
1082        &self,
1083        mut start_info: ComponentStartInfo,
1084        mut controller: fidl::endpoints::ServerEnd<ComponentControllerMarker>,
1085    ) -> Result<(), fidl::Error> {
1086        self.client.send::<ComponentRunnerStartRequest>(
1087            (&mut start_info, controller),
1088            0xad5a8c19f25ee09,
1089            fidl::encoding::DynamicFlags::empty(),
1090        )
1091    }
1092}
1093
1094pub struct ComponentRunnerEventStream {
1095    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
1096}
1097
1098impl std::marker::Unpin for ComponentRunnerEventStream {}
1099
1100impl futures::stream::FusedStream for ComponentRunnerEventStream {
1101    fn is_terminated(&self) -> bool {
1102        self.event_receiver.is_terminated()
1103    }
1104}
1105
1106impl futures::Stream for ComponentRunnerEventStream {
1107    type Item = Result<ComponentRunnerEvent, fidl::Error>;
1108
1109    fn poll_next(
1110        mut self: std::pin::Pin<&mut Self>,
1111        cx: &mut std::task::Context<'_>,
1112    ) -> std::task::Poll<Option<Self::Item>> {
1113        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1114            &mut self.event_receiver,
1115            cx
1116        )?) {
1117            Some(buf) => std::task::Poll::Ready(Some(ComponentRunnerEvent::decode(buf))),
1118            None => std::task::Poll::Ready(None),
1119        }
1120    }
1121}
1122
1123#[derive(Debug)]
1124pub enum ComponentRunnerEvent {
1125    #[non_exhaustive]
1126    _UnknownEvent {
1127        /// Ordinal of the event that was sent.
1128        ordinal: u64,
1129    },
1130}
1131
1132impl ComponentRunnerEvent {
1133    /// Decodes a message buffer as a [`ComponentRunnerEvent`].
1134    fn decode(
1135        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1136    ) -> Result<ComponentRunnerEvent, fidl::Error> {
1137        let (bytes, _handles) = buf.split_mut();
1138        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1139        debug_assert_eq!(tx_header.tx_id, 0);
1140        match tx_header.ordinal {
1141            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
1142                Ok(ComponentRunnerEvent::_UnknownEvent { ordinal: tx_header.ordinal })
1143            }
1144            _ => Err(fidl::Error::UnknownOrdinal {
1145                ordinal: tx_header.ordinal,
1146                protocol_name:
1147                    <ComponentRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1148            }),
1149        }
1150    }
1151}
1152
1153/// A Stream of incoming requests for fuchsia.component.runner/ComponentRunner.
1154pub struct ComponentRunnerRequestStream {
1155    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1156    is_terminated: bool,
1157}
1158
1159impl std::marker::Unpin for ComponentRunnerRequestStream {}
1160
1161impl futures::stream::FusedStream for ComponentRunnerRequestStream {
1162    fn is_terminated(&self) -> bool {
1163        self.is_terminated
1164    }
1165}
1166
1167impl fidl::endpoints::RequestStream for ComponentRunnerRequestStream {
1168    type Protocol = ComponentRunnerMarker;
1169    type ControlHandle = ComponentRunnerControlHandle;
1170
1171    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
1172        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1173    }
1174
1175    fn control_handle(&self) -> Self::ControlHandle {
1176        ComponentRunnerControlHandle { inner: self.inner.clone() }
1177    }
1178
1179    fn into_inner(
1180        self,
1181    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
1182    {
1183        (self.inner, self.is_terminated)
1184    }
1185
1186    fn from_inner(
1187        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1188        is_terminated: bool,
1189    ) -> Self {
1190        Self { inner, is_terminated }
1191    }
1192}
1193
1194impl futures::Stream for ComponentRunnerRequestStream {
1195    type Item = Result<ComponentRunnerRequest, fidl::Error>;
1196
1197    fn poll_next(
1198        mut self: std::pin::Pin<&mut Self>,
1199        cx: &mut std::task::Context<'_>,
1200    ) -> std::task::Poll<Option<Self::Item>> {
1201        let this = &mut *self;
1202        if this.inner.check_shutdown(cx) {
1203            this.is_terminated = true;
1204            return std::task::Poll::Ready(None);
1205        }
1206        if this.is_terminated {
1207            panic!("polled ComponentRunnerRequestStream after completion");
1208        }
1209        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
1210            |bytes, handles| {
1211                match this.inner.channel().read_etc(cx, bytes, handles) {
1212                    std::task::Poll::Ready(Ok(())) => {}
1213                    std::task::Poll::Pending => return std::task::Poll::Pending,
1214                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
1215                        this.is_terminated = true;
1216                        return std::task::Poll::Ready(None);
1217                    }
1218                    std::task::Poll::Ready(Err(e)) => {
1219                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1220                            e.into(),
1221                        ))))
1222                    }
1223                }
1224
1225                // A message has been received from the channel
1226                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1227
1228                std::task::Poll::Ready(Some(match header.ordinal {
1229                    0xad5a8c19f25ee09 => {
1230                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
1231                        let mut req = fidl::new_empty!(
1232                            ComponentRunnerStartRequest,
1233                            fidl::encoding::DefaultFuchsiaResourceDialect
1234                        );
1235                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ComponentRunnerStartRequest>(&header, _body_bytes, handles, &mut req)?;
1236                        let control_handle =
1237                            ComponentRunnerControlHandle { inner: this.inner.clone() };
1238                        Ok(ComponentRunnerRequest::Start {
1239                            start_info: req.start_info,
1240                            controller: req.controller,
1241
1242                            control_handle,
1243                        })
1244                    }
1245                    _ if header.tx_id == 0
1246                        && header
1247                            .dynamic_flags()
1248                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
1249                    {
1250                        Ok(ComponentRunnerRequest::_UnknownMethod {
1251                            ordinal: header.ordinal,
1252                            control_handle: ComponentRunnerControlHandle {
1253                                inner: this.inner.clone(),
1254                            },
1255                            method_type: fidl::MethodType::OneWay,
1256                        })
1257                    }
1258                    _ if header
1259                        .dynamic_flags()
1260                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
1261                    {
1262                        this.inner.send_framework_err(
1263                            fidl::encoding::FrameworkErr::UnknownMethod,
1264                            header.tx_id,
1265                            header.ordinal,
1266                            header.dynamic_flags(),
1267                            (bytes, handles),
1268                        )?;
1269                        Ok(ComponentRunnerRequest::_UnknownMethod {
1270                            ordinal: header.ordinal,
1271                            control_handle: ComponentRunnerControlHandle {
1272                                inner: this.inner.clone(),
1273                            },
1274                            method_type: fidl::MethodType::TwoWay,
1275                        })
1276                    }
1277                    _ => Err(fidl::Error::UnknownOrdinal {
1278                        ordinal: header.ordinal,
1279                        protocol_name:
1280                            <ComponentRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1281                    }),
1282                }))
1283            },
1284        )
1285    }
1286}
1287
1288/// A protocol used for running components.
1289///
1290/// This protocol is implemented by components which provide a runtime
1291/// environment for other components.
1292///
1293/// Note: The component manager is the only intended direct client of this
1294/// interface.
1295#[derive(Debug)]
1296pub enum ComponentRunnerRequest {
1297    /// Start running a component instance described by `start_info`.
1298    ///
1299    /// Component manager binds and uses `controller` to control the
1300    /// lifetime of the newly started component instance.
1301    ///
1302    /// Errors are delivered as epitaphs over the `ComponentController`
1303    /// protocol. In the event of an error, the runner must ensure that
1304    /// resources are cleaned up.
1305    Start {
1306        start_info: ComponentStartInfo,
1307        controller: fidl::endpoints::ServerEnd<ComponentControllerMarker>,
1308        control_handle: ComponentRunnerControlHandle,
1309    },
1310    /// An interaction was received which does not match any known method.
1311    #[non_exhaustive]
1312    _UnknownMethod {
1313        /// Ordinal of the method that was called.
1314        ordinal: u64,
1315        control_handle: ComponentRunnerControlHandle,
1316        method_type: fidl::MethodType,
1317    },
1318}
1319
1320impl ComponentRunnerRequest {
1321    #[allow(irrefutable_let_patterns)]
1322    pub fn into_start(
1323        self,
1324    ) -> Option<(
1325        ComponentStartInfo,
1326        fidl::endpoints::ServerEnd<ComponentControllerMarker>,
1327        ComponentRunnerControlHandle,
1328    )> {
1329        if let ComponentRunnerRequest::Start { start_info, controller, control_handle } = self {
1330            Some((start_info, controller, control_handle))
1331        } else {
1332            None
1333        }
1334    }
1335
1336    /// Name of the method defined in FIDL
1337    pub fn method_name(&self) -> &'static str {
1338        match *self {
1339            ComponentRunnerRequest::Start { .. } => "start",
1340            ComponentRunnerRequest::_UnknownMethod {
1341                method_type: fidl::MethodType::OneWay,
1342                ..
1343            } => "unknown one-way method",
1344            ComponentRunnerRequest::_UnknownMethod {
1345                method_type: fidl::MethodType::TwoWay,
1346                ..
1347            } => "unknown two-way method",
1348        }
1349    }
1350}
1351
1352#[derive(Debug, Clone)]
1353pub struct ComponentRunnerControlHandle {
1354    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1355}
1356
1357impl fidl::endpoints::ControlHandle for ComponentRunnerControlHandle {
1358    fn shutdown(&self) {
1359        self.inner.shutdown()
1360    }
1361    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
1362        self.inner.shutdown_with_epitaph(status)
1363    }
1364
1365    fn is_closed(&self) -> bool {
1366        self.inner.channel().is_closed()
1367    }
1368    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1369        self.inner.channel().on_closed()
1370    }
1371
1372    #[cfg(target_os = "fuchsia")]
1373    fn signal_peer(
1374        &self,
1375        clear_mask: zx::Signals,
1376        set_mask: zx::Signals,
1377    ) -> Result<(), zx_status::Status> {
1378        use fidl::Peered;
1379        self.inner.channel().signal_peer(clear_mask, set_mask)
1380    }
1381}
1382
1383impl ComponentRunnerControlHandle {}
1384
1385#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
1386pub struct TaskProviderMarker;
1387
1388impl fidl::endpoints::ProtocolMarker for TaskProviderMarker {
1389    type Proxy = TaskProviderProxy;
1390    type RequestStream = TaskProviderRequestStream;
1391    #[cfg(target_os = "fuchsia")]
1392    type SynchronousProxy = TaskProviderSynchronousProxy;
1393
1394    const DEBUG_NAME: &'static str = "fuchsia.component.runner.TaskProvider";
1395}
1396impl fidl::endpoints::DiscoverableProtocolMarker for TaskProviderMarker {}
1397pub type TaskProviderGetJobResult = Result<fidl::Job, i32>;
1398
1399pub trait TaskProviderProxyInterface: Send + Sync {
1400    type GetJobResponseFut: std::future::Future<Output = Result<TaskProviderGetJobResult, fidl::Error>>
1401        + Send;
1402    fn r#get_job(&self) -> Self::GetJobResponseFut;
1403}
1404#[derive(Debug)]
1405#[cfg(target_os = "fuchsia")]
1406pub struct TaskProviderSynchronousProxy {
1407    client: fidl::client::sync::Client,
1408}
1409
1410#[cfg(target_os = "fuchsia")]
1411impl fidl::endpoints::SynchronousProxy for TaskProviderSynchronousProxy {
1412    type Proxy = TaskProviderProxy;
1413    type Protocol = TaskProviderMarker;
1414
1415    fn from_channel(inner: fidl::Channel) -> Self {
1416        Self::new(inner)
1417    }
1418
1419    fn into_channel(self) -> fidl::Channel {
1420        self.client.into_channel()
1421    }
1422
1423    fn as_channel(&self) -> &fidl::Channel {
1424        self.client.as_channel()
1425    }
1426}
1427
1428#[cfg(target_os = "fuchsia")]
1429impl TaskProviderSynchronousProxy {
1430    pub fn new(channel: fidl::Channel) -> Self {
1431        let protocol_name = <TaskProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1432        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
1433    }
1434
1435    pub fn into_channel(self) -> fidl::Channel {
1436        self.client.into_channel()
1437    }
1438
1439    /// Waits until an event arrives and returns it. It is safe for other
1440    /// threads to make concurrent requests while waiting for an event.
1441    pub fn wait_for_event(
1442        &self,
1443        deadline: zx::MonotonicInstant,
1444    ) -> Result<TaskProviderEvent, fidl::Error> {
1445        TaskProviderEvent::decode(self.client.wait_for_event(deadline)?)
1446    }
1447
1448    /// Returns a job handle for the component requested.
1449    ///
1450    /// On success, returns a handle with the same rights as the runner's.
1451    pub fn r#get_job(
1452        &self,
1453        ___deadline: zx::MonotonicInstant,
1454    ) -> Result<TaskProviderGetJobResult, fidl::Error> {
1455        let _response = self.client.send_query::<
1456            fidl::encoding::EmptyPayload,
1457            fidl::encoding::ResultType<TaskProviderGetJobResponse, i32>,
1458        >(
1459            (),
1460            0x4c9ca4f4fdece3ad,
1461            fidl::encoding::DynamicFlags::empty(),
1462            ___deadline,
1463        )?;
1464        Ok(_response.map(|x| x.job))
1465    }
1466}
1467
1468#[cfg(target_os = "fuchsia")]
1469impl From<TaskProviderSynchronousProxy> for zx::Handle {
1470    fn from(value: TaskProviderSynchronousProxy) -> Self {
1471        value.into_channel().into()
1472    }
1473}
1474
1475#[cfg(target_os = "fuchsia")]
1476impl From<fidl::Channel> for TaskProviderSynchronousProxy {
1477    fn from(value: fidl::Channel) -> Self {
1478        Self::new(value)
1479    }
1480}
1481
1482#[cfg(target_os = "fuchsia")]
1483impl fidl::endpoints::FromClient for TaskProviderSynchronousProxy {
1484    type Protocol = TaskProviderMarker;
1485
1486    fn from_client(value: fidl::endpoints::ClientEnd<TaskProviderMarker>) -> Self {
1487        Self::new(value.into_channel())
1488    }
1489}
1490
1491#[derive(Debug, Clone)]
1492pub struct TaskProviderProxy {
1493    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
1494}
1495
1496impl fidl::endpoints::Proxy for TaskProviderProxy {
1497    type Protocol = TaskProviderMarker;
1498
1499    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
1500        Self::new(inner)
1501    }
1502
1503    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
1504        self.client.into_channel().map_err(|client| Self { client })
1505    }
1506
1507    fn as_channel(&self) -> &::fidl::AsyncChannel {
1508        self.client.as_channel()
1509    }
1510}
1511
1512impl TaskProviderProxy {
1513    /// Create a new Proxy for fuchsia.component.runner/TaskProvider.
1514    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
1515        let protocol_name = <TaskProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1516        Self { client: fidl::client::Client::new(channel, protocol_name) }
1517    }
1518
1519    /// Get a Stream of events from the remote end of the protocol.
1520    ///
1521    /// # Panics
1522    ///
1523    /// Panics if the event stream was already taken.
1524    pub fn take_event_stream(&self) -> TaskProviderEventStream {
1525        TaskProviderEventStream { event_receiver: self.client.take_event_receiver() }
1526    }
1527
1528    /// Returns a job handle for the component requested.
1529    ///
1530    /// On success, returns a handle with the same rights as the runner's.
1531    pub fn r#get_job(
1532        &self,
1533    ) -> fidl::client::QueryResponseFut<
1534        TaskProviderGetJobResult,
1535        fidl::encoding::DefaultFuchsiaResourceDialect,
1536    > {
1537        TaskProviderProxyInterface::r#get_job(self)
1538    }
1539}
1540
1541impl TaskProviderProxyInterface for TaskProviderProxy {
1542    type GetJobResponseFut = fidl::client::QueryResponseFut<
1543        TaskProviderGetJobResult,
1544        fidl::encoding::DefaultFuchsiaResourceDialect,
1545    >;
1546    fn r#get_job(&self) -> Self::GetJobResponseFut {
1547        fn _decode(
1548            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1549        ) -> Result<TaskProviderGetJobResult, fidl::Error> {
1550            let _response = fidl::client::decode_transaction_body::<
1551                fidl::encoding::ResultType<TaskProviderGetJobResponse, i32>,
1552                fidl::encoding::DefaultFuchsiaResourceDialect,
1553                0x4c9ca4f4fdece3ad,
1554            >(_buf?)?;
1555            Ok(_response.map(|x| x.job))
1556        }
1557        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, TaskProviderGetJobResult>(
1558            (),
1559            0x4c9ca4f4fdece3ad,
1560            fidl::encoding::DynamicFlags::empty(),
1561            _decode,
1562        )
1563    }
1564}
1565
1566pub struct TaskProviderEventStream {
1567    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
1568}
1569
1570impl std::marker::Unpin for TaskProviderEventStream {}
1571
1572impl futures::stream::FusedStream for TaskProviderEventStream {
1573    fn is_terminated(&self) -> bool {
1574        self.event_receiver.is_terminated()
1575    }
1576}
1577
1578impl futures::Stream for TaskProviderEventStream {
1579    type Item = Result<TaskProviderEvent, fidl::Error>;
1580
1581    fn poll_next(
1582        mut self: std::pin::Pin<&mut Self>,
1583        cx: &mut std::task::Context<'_>,
1584    ) -> std::task::Poll<Option<Self::Item>> {
1585        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1586            &mut self.event_receiver,
1587            cx
1588        )?) {
1589            Some(buf) => std::task::Poll::Ready(Some(TaskProviderEvent::decode(buf))),
1590            None => std::task::Poll::Ready(None),
1591        }
1592    }
1593}
1594
1595#[derive(Debug)]
1596pub enum TaskProviderEvent {
1597    #[non_exhaustive]
1598    _UnknownEvent {
1599        /// Ordinal of the event that was sent.
1600        ordinal: u64,
1601    },
1602}
1603
1604impl TaskProviderEvent {
1605    /// Decodes a message buffer as a [`TaskProviderEvent`].
1606    fn decode(
1607        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1608    ) -> Result<TaskProviderEvent, fidl::Error> {
1609        let (bytes, _handles) = buf.split_mut();
1610        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1611        debug_assert_eq!(tx_header.tx_id, 0);
1612        match tx_header.ordinal {
1613            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
1614                Ok(TaskProviderEvent::_UnknownEvent { ordinal: tx_header.ordinal })
1615            }
1616            _ => Err(fidl::Error::UnknownOrdinal {
1617                ordinal: tx_header.ordinal,
1618                protocol_name: <TaskProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1619            }),
1620        }
1621    }
1622}
1623
1624/// A Stream of incoming requests for fuchsia.component.runner/TaskProvider.
1625pub struct TaskProviderRequestStream {
1626    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1627    is_terminated: bool,
1628}
1629
1630impl std::marker::Unpin for TaskProviderRequestStream {}
1631
1632impl futures::stream::FusedStream for TaskProviderRequestStream {
1633    fn is_terminated(&self) -> bool {
1634        self.is_terminated
1635    }
1636}
1637
1638impl fidl::endpoints::RequestStream for TaskProviderRequestStream {
1639    type Protocol = TaskProviderMarker;
1640    type ControlHandle = TaskProviderControlHandle;
1641
1642    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
1643        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1644    }
1645
1646    fn control_handle(&self) -> Self::ControlHandle {
1647        TaskProviderControlHandle { inner: self.inner.clone() }
1648    }
1649
1650    fn into_inner(
1651        self,
1652    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
1653    {
1654        (self.inner, self.is_terminated)
1655    }
1656
1657    fn from_inner(
1658        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1659        is_terminated: bool,
1660    ) -> Self {
1661        Self { inner, is_terminated }
1662    }
1663}
1664
1665impl futures::Stream for TaskProviderRequestStream {
1666    type Item = Result<TaskProviderRequest, fidl::Error>;
1667
1668    fn poll_next(
1669        mut self: std::pin::Pin<&mut Self>,
1670        cx: &mut std::task::Context<'_>,
1671    ) -> std::task::Poll<Option<Self::Item>> {
1672        let this = &mut *self;
1673        if this.inner.check_shutdown(cx) {
1674            this.is_terminated = true;
1675            return std::task::Poll::Ready(None);
1676        }
1677        if this.is_terminated {
1678            panic!("polled TaskProviderRequestStream after completion");
1679        }
1680        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
1681            |bytes, handles| {
1682                match this.inner.channel().read_etc(cx, bytes, handles) {
1683                    std::task::Poll::Ready(Ok(())) => {}
1684                    std::task::Poll::Pending => return std::task::Poll::Pending,
1685                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
1686                        this.is_terminated = true;
1687                        return std::task::Poll::Ready(None);
1688                    }
1689                    std::task::Poll::Ready(Err(e)) => {
1690                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1691                            e.into(),
1692                        ))))
1693                    }
1694                }
1695
1696                // A message has been received from the channel
1697                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1698
1699                std::task::Poll::Ready(Some(match header.ordinal {
1700                    0x4c9ca4f4fdece3ad => {
1701                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1702                        let mut req = fidl::new_empty!(
1703                            fidl::encoding::EmptyPayload,
1704                            fidl::encoding::DefaultFuchsiaResourceDialect
1705                        );
1706                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
1707                        let control_handle =
1708                            TaskProviderControlHandle { inner: this.inner.clone() };
1709                        Ok(TaskProviderRequest::GetJob {
1710                            responder: TaskProviderGetJobResponder {
1711                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1712                                tx_id: header.tx_id,
1713                            },
1714                        })
1715                    }
1716                    _ if header.tx_id == 0
1717                        && header
1718                            .dynamic_flags()
1719                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
1720                    {
1721                        Ok(TaskProviderRequest::_UnknownMethod {
1722                            ordinal: header.ordinal,
1723                            control_handle: TaskProviderControlHandle { inner: this.inner.clone() },
1724                            method_type: fidl::MethodType::OneWay,
1725                        })
1726                    }
1727                    _ if header
1728                        .dynamic_flags()
1729                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
1730                    {
1731                        this.inner.send_framework_err(
1732                            fidl::encoding::FrameworkErr::UnknownMethod,
1733                            header.tx_id,
1734                            header.ordinal,
1735                            header.dynamic_flags(),
1736                            (bytes, handles),
1737                        )?;
1738                        Ok(TaskProviderRequest::_UnknownMethod {
1739                            ordinal: header.ordinal,
1740                            control_handle: TaskProviderControlHandle { inner: this.inner.clone() },
1741                            method_type: fidl::MethodType::TwoWay,
1742                        })
1743                    }
1744                    _ => Err(fidl::Error::UnknownOrdinal {
1745                        ordinal: header.ordinal,
1746                        protocol_name:
1747                            <TaskProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1748                    }),
1749                }))
1750            },
1751        )
1752    }
1753}
1754
1755/// Served by runners that want to make a zircon job available through their runtime directory.
1756#[derive(Debug)]
1757pub enum TaskProviderRequest {
1758    /// Returns a job handle for the component requested.
1759    ///
1760    /// On success, returns a handle with the same rights as the runner's.
1761    GetJob { responder: TaskProviderGetJobResponder },
1762    /// An interaction was received which does not match any known method.
1763    #[non_exhaustive]
1764    _UnknownMethod {
1765        /// Ordinal of the method that was called.
1766        ordinal: u64,
1767        control_handle: TaskProviderControlHandle,
1768        method_type: fidl::MethodType,
1769    },
1770}
1771
1772impl TaskProviderRequest {
1773    #[allow(irrefutable_let_patterns)]
1774    pub fn into_get_job(self) -> Option<(TaskProviderGetJobResponder)> {
1775        if let TaskProviderRequest::GetJob { responder } = self {
1776            Some((responder))
1777        } else {
1778            None
1779        }
1780    }
1781
1782    /// Name of the method defined in FIDL
1783    pub fn method_name(&self) -> &'static str {
1784        match *self {
1785            TaskProviderRequest::GetJob { .. } => "get_job",
1786            TaskProviderRequest::_UnknownMethod {
1787                method_type: fidl::MethodType::OneWay, ..
1788            } => "unknown one-way method",
1789            TaskProviderRequest::_UnknownMethod {
1790                method_type: fidl::MethodType::TwoWay, ..
1791            } => "unknown two-way method",
1792        }
1793    }
1794}
1795
1796#[derive(Debug, Clone)]
1797pub struct TaskProviderControlHandle {
1798    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1799}
1800
1801impl fidl::endpoints::ControlHandle for TaskProviderControlHandle {
1802    fn shutdown(&self) {
1803        self.inner.shutdown()
1804    }
1805    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
1806        self.inner.shutdown_with_epitaph(status)
1807    }
1808
1809    fn is_closed(&self) -> bool {
1810        self.inner.channel().is_closed()
1811    }
1812    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1813        self.inner.channel().on_closed()
1814    }
1815
1816    #[cfg(target_os = "fuchsia")]
1817    fn signal_peer(
1818        &self,
1819        clear_mask: zx::Signals,
1820        set_mask: zx::Signals,
1821    ) -> Result<(), zx_status::Status> {
1822        use fidl::Peered;
1823        self.inner.channel().signal_peer(clear_mask, set_mask)
1824    }
1825}
1826
1827impl TaskProviderControlHandle {}
1828
1829#[must_use = "FIDL methods require a response to be sent"]
1830#[derive(Debug)]
1831pub struct TaskProviderGetJobResponder {
1832    control_handle: std::mem::ManuallyDrop<TaskProviderControlHandle>,
1833    tx_id: u32,
1834}
1835
1836/// Set the the channel to be shutdown (see [`TaskProviderControlHandle::shutdown`])
1837/// if the responder is dropped without sending a response, so that the client
1838/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1839impl std::ops::Drop for TaskProviderGetJobResponder {
1840    fn drop(&mut self) {
1841        self.control_handle.shutdown();
1842        // Safety: drops once, never accessed again
1843        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1844    }
1845}
1846
1847impl fidl::endpoints::Responder for TaskProviderGetJobResponder {
1848    type ControlHandle = TaskProviderControlHandle;
1849
1850    fn control_handle(&self) -> &TaskProviderControlHandle {
1851        &self.control_handle
1852    }
1853
1854    fn drop_without_shutdown(mut self) {
1855        // Safety: drops once, never accessed again due to mem::forget
1856        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1857        // Prevent Drop from running (which would shut down the channel)
1858        std::mem::forget(self);
1859    }
1860}
1861
1862impl TaskProviderGetJobResponder {
1863    /// Sends a response to the FIDL transaction.
1864    ///
1865    /// Sets the channel to shutdown if an error occurs.
1866    pub fn send(self, mut result: Result<fidl::Job, i32>) -> Result<(), fidl::Error> {
1867        let _result = self.send_raw(result);
1868        if _result.is_err() {
1869            self.control_handle.shutdown();
1870        }
1871        self.drop_without_shutdown();
1872        _result
1873    }
1874
1875    /// Similar to "send" but does not shutdown the channel if an error occurs.
1876    pub fn send_no_shutdown_on_err(
1877        self,
1878        mut result: Result<fidl::Job, i32>,
1879    ) -> Result<(), fidl::Error> {
1880        let _result = self.send_raw(result);
1881        self.drop_without_shutdown();
1882        _result
1883    }
1884
1885    fn send_raw(&self, mut result: Result<fidl::Job, i32>) -> Result<(), fidl::Error> {
1886        self.control_handle
1887            .inner
1888            .send::<fidl::encoding::ResultType<TaskProviderGetJobResponse, i32>>(
1889                result.map(|job| (job,)),
1890                self.tx_id,
1891                0x4c9ca4f4fdece3ad,
1892                fidl::encoding::DynamicFlags::empty(),
1893            )
1894    }
1895}
1896
1897mod internal {
1898    use super::*;
1899
1900    impl fidl::encoding::ResourceTypeMarker for ComponentControllerOnPublishDiagnosticsRequest {
1901        type Borrowed<'a> = &'a mut Self;
1902        fn take_or_borrow<'a>(
1903            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1904        ) -> Self::Borrowed<'a> {
1905            value
1906        }
1907    }
1908
1909    unsafe impl fidl::encoding::TypeMarker for ComponentControllerOnPublishDiagnosticsRequest {
1910        type Owned = Self;
1911
1912        #[inline(always)]
1913        fn inline_align(_context: fidl::encoding::Context) -> usize {
1914            8
1915        }
1916
1917        #[inline(always)]
1918        fn inline_size(_context: fidl::encoding::Context) -> usize {
1919            16
1920        }
1921    }
1922
1923    unsafe impl
1924        fidl::encoding::Encode<
1925            ComponentControllerOnPublishDiagnosticsRequest,
1926            fidl::encoding::DefaultFuchsiaResourceDialect,
1927        > for &mut ComponentControllerOnPublishDiagnosticsRequest
1928    {
1929        #[inline]
1930        unsafe fn encode(
1931            self,
1932            encoder: &mut fidl::encoding::Encoder<
1933                '_,
1934                fidl::encoding::DefaultFuchsiaResourceDialect,
1935            >,
1936            offset: usize,
1937            _depth: fidl::encoding::Depth,
1938        ) -> fidl::Result<()> {
1939            encoder.debug_check_bounds::<ComponentControllerOnPublishDiagnosticsRequest>(offset);
1940            // Delegate to tuple encoding.
1941            fidl::encoding::Encode::<
1942                ComponentControllerOnPublishDiagnosticsRequest,
1943                fidl::encoding::DefaultFuchsiaResourceDialect,
1944            >::encode(
1945                (<ComponentDiagnostics as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1946                    &mut self.payload,
1947                ),),
1948                encoder,
1949                offset,
1950                _depth,
1951            )
1952        }
1953    }
1954    unsafe impl<
1955            T0: fidl::encoding::Encode<
1956                ComponentDiagnostics,
1957                fidl::encoding::DefaultFuchsiaResourceDialect,
1958            >,
1959        >
1960        fidl::encoding::Encode<
1961            ComponentControllerOnPublishDiagnosticsRequest,
1962            fidl::encoding::DefaultFuchsiaResourceDialect,
1963        > for (T0,)
1964    {
1965        #[inline]
1966        unsafe fn encode(
1967            self,
1968            encoder: &mut fidl::encoding::Encoder<
1969                '_,
1970                fidl::encoding::DefaultFuchsiaResourceDialect,
1971            >,
1972            offset: usize,
1973            depth: fidl::encoding::Depth,
1974        ) -> fidl::Result<()> {
1975            encoder.debug_check_bounds::<ComponentControllerOnPublishDiagnosticsRequest>(offset);
1976            // Zero out padding regions. There's no need to apply masks
1977            // because the unmasked parts will be overwritten by fields.
1978            // Write the fields.
1979            self.0.encode(encoder, offset + 0, depth)?;
1980            Ok(())
1981        }
1982    }
1983
1984    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1985        for ComponentControllerOnPublishDiagnosticsRequest
1986    {
1987        #[inline(always)]
1988        fn new_empty() -> Self {
1989            Self {
1990                payload: fidl::new_empty!(
1991                    ComponentDiagnostics,
1992                    fidl::encoding::DefaultFuchsiaResourceDialect
1993                ),
1994            }
1995        }
1996
1997        #[inline]
1998        unsafe fn decode(
1999            &mut self,
2000            decoder: &mut fidl::encoding::Decoder<
2001                '_,
2002                fidl::encoding::DefaultFuchsiaResourceDialect,
2003            >,
2004            offset: usize,
2005            _depth: fidl::encoding::Depth,
2006        ) -> fidl::Result<()> {
2007            decoder.debug_check_bounds::<Self>(offset);
2008            // Verify that padding bytes are zero.
2009            fidl::decode!(
2010                ComponentDiagnostics,
2011                fidl::encoding::DefaultFuchsiaResourceDialect,
2012                &mut self.payload,
2013                decoder,
2014                offset + 0,
2015                _depth
2016            )?;
2017            Ok(())
2018        }
2019    }
2020
2021    impl fidl::encoding::ResourceTypeMarker for ComponentRunnerStartRequest {
2022        type Borrowed<'a> = &'a mut Self;
2023        fn take_or_borrow<'a>(
2024            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2025        ) -> Self::Borrowed<'a> {
2026            value
2027        }
2028    }
2029
2030    unsafe impl fidl::encoding::TypeMarker for ComponentRunnerStartRequest {
2031        type Owned = Self;
2032
2033        #[inline(always)]
2034        fn inline_align(_context: fidl::encoding::Context) -> usize {
2035            8
2036        }
2037
2038        #[inline(always)]
2039        fn inline_size(_context: fidl::encoding::Context) -> usize {
2040            24
2041        }
2042    }
2043
2044    unsafe impl
2045        fidl::encoding::Encode<
2046            ComponentRunnerStartRequest,
2047            fidl::encoding::DefaultFuchsiaResourceDialect,
2048        > for &mut ComponentRunnerStartRequest
2049    {
2050        #[inline]
2051        unsafe fn encode(
2052            self,
2053            encoder: &mut fidl::encoding::Encoder<
2054                '_,
2055                fidl::encoding::DefaultFuchsiaResourceDialect,
2056            >,
2057            offset: usize,
2058            _depth: fidl::encoding::Depth,
2059        ) -> fidl::Result<()> {
2060            encoder.debug_check_bounds::<ComponentRunnerStartRequest>(offset);
2061            // Delegate to tuple encoding.
2062            fidl::encoding::Encode::<ComponentRunnerStartRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
2063                (
2064                    <ComponentStartInfo as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.start_info),
2065                    <fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ComponentControllerMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.controller),
2066                ),
2067                encoder, offset, _depth
2068            )
2069        }
2070    }
2071    unsafe impl<
2072            T0: fidl::encoding::Encode<
2073                ComponentStartInfo,
2074                fidl::encoding::DefaultFuchsiaResourceDialect,
2075            >,
2076            T1: fidl::encoding::Encode<
2077                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ComponentControllerMarker>>,
2078                fidl::encoding::DefaultFuchsiaResourceDialect,
2079            >,
2080        >
2081        fidl::encoding::Encode<
2082            ComponentRunnerStartRequest,
2083            fidl::encoding::DefaultFuchsiaResourceDialect,
2084        > for (T0, T1)
2085    {
2086        #[inline]
2087        unsafe fn encode(
2088            self,
2089            encoder: &mut fidl::encoding::Encoder<
2090                '_,
2091                fidl::encoding::DefaultFuchsiaResourceDialect,
2092            >,
2093            offset: usize,
2094            depth: fidl::encoding::Depth,
2095        ) -> fidl::Result<()> {
2096            encoder.debug_check_bounds::<ComponentRunnerStartRequest>(offset);
2097            // Zero out padding regions. There's no need to apply masks
2098            // because the unmasked parts will be overwritten by fields.
2099            unsafe {
2100                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
2101                (ptr as *mut u64).write_unaligned(0);
2102            }
2103            // Write the fields.
2104            self.0.encode(encoder, offset + 0, depth)?;
2105            self.1.encode(encoder, offset + 16, depth)?;
2106            Ok(())
2107        }
2108    }
2109
2110    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2111        for ComponentRunnerStartRequest
2112    {
2113        #[inline(always)]
2114        fn new_empty() -> Self {
2115            Self {
2116                start_info: fidl::new_empty!(
2117                    ComponentStartInfo,
2118                    fidl::encoding::DefaultFuchsiaResourceDialect
2119                ),
2120                controller: fidl::new_empty!(
2121                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ComponentControllerMarker>>,
2122                    fidl::encoding::DefaultFuchsiaResourceDialect
2123                ),
2124            }
2125        }
2126
2127        #[inline]
2128        unsafe fn decode(
2129            &mut self,
2130            decoder: &mut fidl::encoding::Decoder<
2131                '_,
2132                fidl::encoding::DefaultFuchsiaResourceDialect,
2133            >,
2134            offset: usize,
2135            _depth: fidl::encoding::Depth,
2136        ) -> fidl::Result<()> {
2137            decoder.debug_check_bounds::<Self>(offset);
2138            // Verify that padding bytes are zero.
2139            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
2140            let padval = unsafe { (ptr as *const u64).read_unaligned() };
2141            let mask = 0xffffffff00000000u64;
2142            let maskedval = padval & mask;
2143            if maskedval != 0 {
2144                return Err(fidl::Error::NonZeroPadding {
2145                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
2146                });
2147            }
2148            fidl::decode!(
2149                ComponentStartInfo,
2150                fidl::encoding::DefaultFuchsiaResourceDialect,
2151                &mut self.start_info,
2152                decoder,
2153                offset + 0,
2154                _depth
2155            )?;
2156            fidl::decode!(
2157                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ComponentControllerMarker>>,
2158                fidl::encoding::DefaultFuchsiaResourceDialect,
2159                &mut self.controller,
2160                decoder,
2161                offset + 16,
2162                _depth
2163            )?;
2164            Ok(())
2165        }
2166    }
2167
2168    impl fidl::encoding::ResourceTypeMarker for TaskProviderGetJobResponse {
2169        type Borrowed<'a> = &'a mut Self;
2170        fn take_or_borrow<'a>(
2171            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2172        ) -> Self::Borrowed<'a> {
2173            value
2174        }
2175    }
2176
2177    unsafe impl fidl::encoding::TypeMarker for TaskProviderGetJobResponse {
2178        type Owned = Self;
2179
2180        #[inline(always)]
2181        fn inline_align(_context: fidl::encoding::Context) -> usize {
2182            4
2183        }
2184
2185        #[inline(always)]
2186        fn inline_size(_context: fidl::encoding::Context) -> usize {
2187            4
2188        }
2189    }
2190
2191    unsafe impl
2192        fidl::encoding::Encode<
2193            TaskProviderGetJobResponse,
2194            fidl::encoding::DefaultFuchsiaResourceDialect,
2195        > for &mut TaskProviderGetJobResponse
2196    {
2197        #[inline]
2198        unsafe fn encode(
2199            self,
2200            encoder: &mut fidl::encoding::Encoder<
2201                '_,
2202                fidl::encoding::DefaultFuchsiaResourceDialect,
2203            >,
2204            offset: usize,
2205            _depth: fidl::encoding::Depth,
2206        ) -> fidl::Result<()> {
2207            encoder.debug_check_bounds::<TaskProviderGetJobResponse>(offset);
2208            // Delegate to tuple encoding.
2209            fidl::encoding::Encode::<
2210                TaskProviderGetJobResponse,
2211                fidl::encoding::DefaultFuchsiaResourceDialect,
2212            >::encode(
2213                (<fidl::encoding::HandleType<
2214                    fidl::Job,
2215                    { fidl::ObjectType::JOB.into_raw() },
2216                    2147483648,
2217                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
2218                    &mut self.job
2219                ),),
2220                encoder,
2221                offset,
2222                _depth,
2223            )
2224        }
2225    }
2226    unsafe impl<
2227            T0: fidl::encoding::Encode<
2228                fidl::encoding::HandleType<
2229                    fidl::Job,
2230                    { fidl::ObjectType::JOB.into_raw() },
2231                    2147483648,
2232                >,
2233                fidl::encoding::DefaultFuchsiaResourceDialect,
2234            >,
2235        >
2236        fidl::encoding::Encode<
2237            TaskProviderGetJobResponse,
2238            fidl::encoding::DefaultFuchsiaResourceDialect,
2239        > for (T0,)
2240    {
2241        #[inline]
2242        unsafe fn encode(
2243            self,
2244            encoder: &mut fidl::encoding::Encoder<
2245                '_,
2246                fidl::encoding::DefaultFuchsiaResourceDialect,
2247            >,
2248            offset: usize,
2249            depth: fidl::encoding::Depth,
2250        ) -> fidl::Result<()> {
2251            encoder.debug_check_bounds::<TaskProviderGetJobResponse>(offset);
2252            // Zero out padding regions. There's no need to apply masks
2253            // because the unmasked parts will be overwritten by fields.
2254            // Write the fields.
2255            self.0.encode(encoder, offset + 0, depth)?;
2256            Ok(())
2257        }
2258    }
2259
2260    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2261        for TaskProviderGetJobResponse
2262    {
2263        #[inline(always)]
2264        fn new_empty() -> Self {
2265            Self {
2266                job: fidl::new_empty!(fidl::encoding::HandleType<fidl::Job, { fidl::ObjectType::JOB.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
2267            }
2268        }
2269
2270        #[inline]
2271        unsafe fn decode(
2272            &mut self,
2273            decoder: &mut fidl::encoding::Decoder<
2274                '_,
2275                fidl::encoding::DefaultFuchsiaResourceDialect,
2276            >,
2277            offset: usize,
2278            _depth: fidl::encoding::Depth,
2279        ) -> fidl::Result<()> {
2280            decoder.debug_check_bounds::<Self>(offset);
2281            // Verify that padding bytes are zero.
2282            fidl::decode!(fidl::encoding::HandleType<fidl::Job, { fidl::ObjectType::JOB.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.job, decoder, offset + 0, _depth)?;
2283            Ok(())
2284        }
2285    }
2286
2287    impl ComponentControllerOnEscrowRequest {
2288        #[inline(always)]
2289        fn max_ordinal_present(&self) -> u64 {
2290            if let Some(_) = self.escrowed_dictionary {
2291                return 2;
2292            }
2293            if let Some(_) = self.outgoing_dir {
2294                return 1;
2295            }
2296            0
2297        }
2298    }
2299
2300    impl fidl::encoding::ResourceTypeMarker for ComponentControllerOnEscrowRequest {
2301        type Borrowed<'a> = &'a mut Self;
2302        fn take_or_borrow<'a>(
2303            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2304        ) -> Self::Borrowed<'a> {
2305            value
2306        }
2307    }
2308
2309    unsafe impl fidl::encoding::TypeMarker for ComponentControllerOnEscrowRequest {
2310        type Owned = Self;
2311
2312        #[inline(always)]
2313        fn inline_align(_context: fidl::encoding::Context) -> usize {
2314            8
2315        }
2316
2317        #[inline(always)]
2318        fn inline_size(_context: fidl::encoding::Context) -> usize {
2319            16
2320        }
2321    }
2322
2323    unsafe impl
2324        fidl::encoding::Encode<
2325            ComponentControllerOnEscrowRequest,
2326            fidl::encoding::DefaultFuchsiaResourceDialect,
2327        > for &mut ComponentControllerOnEscrowRequest
2328    {
2329        unsafe fn encode(
2330            self,
2331            encoder: &mut fidl::encoding::Encoder<
2332                '_,
2333                fidl::encoding::DefaultFuchsiaResourceDialect,
2334            >,
2335            offset: usize,
2336            mut depth: fidl::encoding::Depth,
2337        ) -> fidl::Result<()> {
2338            encoder.debug_check_bounds::<ComponentControllerOnEscrowRequest>(offset);
2339            // Vector header
2340            let max_ordinal: u64 = self.max_ordinal_present();
2341            encoder.write_num(max_ordinal, offset);
2342            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2343            // Calling encoder.out_of_line_offset(0) is not allowed.
2344            if max_ordinal == 0 {
2345                return Ok(());
2346            }
2347            depth.increment()?;
2348            let envelope_size = 8;
2349            let bytes_len = max_ordinal as usize * envelope_size;
2350            #[allow(unused_variables)]
2351            let offset = encoder.out_of_line_offset(bytes_len);
2352            let mut _prev_end_offset: usize = 0;
2353            if 1 > max_ordinal {
2354                return Ok(());
2355            }
2356
2357            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2358            // are envelope_size bytes.
2359            let cur_offset: usize = (1 - 1) * envelope_size;
2360
2361            // Zero reserved fields.
2362            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2363
2364            // Safety:
2365            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2366            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2367            //   envelope_size bytes, there is always sufficient room.
2368            fidl::encoding::encode_in_envelope_optional::<
2369                fidl::encoding::Endpoint<
2370                    fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
2371                >,
2372                fidl::encoding::DefaultFuchsiaResourceDialect,
2373            >(
2374                self.outgoing_dir.as_mut().map(
2375                    <fidl::encoding::Endpoint<
2376                        fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
2377                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
2378                ),
2379                encoder,
2380                offset + cur_offset,
2381                depth,
2382            )?;
2383
2384            _prev_end_offset = cur_offset + envelope_size;
2385            if 2 > max_ordinal {
2386                return Ok(());
2387            }
2388
2389            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2390            // are envelope_size bytes.
2391            let cur_offset: usize = (2 - 1) * envelope_size;
2392
2393            // Zero reserved fields.
2394            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2395
2396            // Safety:
2397            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2398            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2399            //   envelope_size bytes, there is always sufficient room.
2400            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_component_sandbox::DictionaryRef, fidl::encoding::DefaultFuchsiaResourceDialect>(
2401            self.escrowed_dictionary.as_mut().map(<fidl_fuchsia_component_sandbox::DictionaryRef as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
2402            encoder, offset + cur_offset, depth
2403        )?;
2404
2405            _prev_end_offset = cur_offset + envelope_size;
2406
2407            Ok(())
2408        }
2409    }
2410
2411    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2412        for ComponentControllerOnEscrowRequest
2413    {
2414        #[inline(always)]
2415        fn new_empty() -> Self {
2416            Self::default()
2417        }
2418
2419        unsafe fn decode(
2420            &mut self,
2421            decoder: &mut fidl::encoding::Decoder<
2422                '_,
2423                fidl::encoding::DefaultFuchsiaResourceDialect,
2424            >,
2425            offset: usize,
2426            mut depth: fidl::encoding::Depth,
2427        ) -> fidl::Result<()> {
2428            decoder.debug_check_bounds::<Self>(offset);
2429            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2430                None => return Err(fidl::Error::NotNullable),
2431                Some(len) => len,
2432            };
2433            // Calling decoder.out_of_line_offset(0) is not allowed.
2434            if len == 0 {
2435                return Ok(());
2436            };
2437            depth.increment()?;
2438            let envelope_size = 8;
2439            let bytes_len = len * envelope_size;
2440            let offset = decoder.out_of_line_offset(bytes_len)?;
2441            // Decode the envelope for each type.
2442            let mut _next_ordinal_to_read = 0;
2443            let mut next_offset = offset;
2444            let end_offset = offset + bytes_len;
2445            _next_ordinal_to_read += 1;
2446            if next_offset >= end_offset {
2447                return Ok(());
2448            }
2449
2450            // Decode unknown envelopes for gaps in ordinals.
2451            while _next_ordinal_to_read < 1 {
2452                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2453                _next_ordinal_to_read += 1;
2454                next_offset += envelope_size;
2455            }
2456
2457            let next_out_of_line = decoder.next_out_of_line();
2458            let handles_before = decoder.remaining_handles();
2459            if let Some((inlined, num_bytes, num_handles)) =
2460                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2461            {
2462                let member_inline_size = <fidl::encoding::Endpoint<
2463                    fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
2464                > as fidl::encoding::TypeMarker>::inline_size(
2465                    decoder.context
2466                );
2467                if inlined != (member_inline_size <= 4) {
2468                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2469                }
2470                let inner_offset;
2471                let mut inner_depth = depth.clone();
2472                if inlined {
2473                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2474                    inner_offset = next_offset;
2475                } else {
2476                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2477                    inner_depth.increment()?;
2478                }
2479                let val_ref = self.outgoing_dir.get_or_insert_with(|| {
2480                    fidl::new_empty!(
2481                        fidl::encoding::Endpoint<
2482                            fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
2483                        >,
2484                        fidl::encoding::DefaultFuchsiaResourceDialect
2485                    )
2486                });
2487                fidl::decode!(
2488                    fidl::encoding::Endpoint<
2489                        fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
2490                    >,
2491                    fidl::encoding::DefaultFuchsiaResourceDialect,
2492                    val_ref,
2493                    decoder,
2494                    inner_offset,
2495                    inner_depth
2496                )?;
2497                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2498                {
2499                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2500                }
2501                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2502                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2503                }
2504            }
2505
2506            next_offset += envelope_size;
2507            _next_ordinal_to_read += 1;
2508            if next_offset >= end_offset {
2509                return Ok(());
2510            }
2511
2512            // Decode unknown envelopes for gaps in ordinals.
2513            while _next_ordinal_to_read < 2 {
2514                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2515                _next_ordinal_to_read += 1;
2516                next_offset += envelope_size;
2517            }
2518
2519            let next_out_of_line = decoder.next_out_of_line();
2520            let handles_before = decoder.remaining_handles();
2521            if let Some((inlined, num_bytes, num_handles)) =
2522                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2523            {
2524                let member_inline_size = <fidl_fuchsia_component_sandbox::DictionaryRef as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2525                if inlined != (member_inline_size <= 4) {
2526                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2527                }
2528                let inner_offset;
2529                let mut inner_depth = depth.clone();
2530                if inlined {
2531                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2532                    inner_offset = next_offset;
2533                } else {
2534                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2535                    inner_depth.increment()?;
2536                }
2537                let val_ref = self.escrowed_dictionary.get_or_insert_with(|| {
2538                    fidl::new_empty!(
2539                        fidl_fuchsia_component_sandbox::DictionaryRef,
2540                        fidl::encoding::DefaultFuchsiaResourceDialect
2541                    )
2542                });
2543                fidl::decode!(
2544                    fidl_fuchsia_component_sandbox::DictionaryRef,
2545                    fidl::encoding::DefaultFuchsiaResourceDialect,
2546                    val_ref,
2547                    decoder,
2548                    inner_offset,
2549                    inner_depth
2550                )?;
2551                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2552                {
2553                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2554                }
2555                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2556                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2557                }
2558            }
2559
2560            next_offset += envelope_size;
2561
2562            // Decode the remaining unknown envelopes.
2563            while next_offset < end_offset {
2564                _next_ordinal_to_read += 1;
2565                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2566                next_offset += envelope_size;
2567            }
2568
2569            Ok(())
2570        }
2571    }
2572
2573    impl ComponentDiagnostics {
2574        #[inline(always)]
2575        fn max_ordinal_present(&self) -> u64 {
2576            if let Some(_) = self.tasks {
2577                return 1;
2578            }
2579            0
2580        }
2581    }
2582
2583    impl fidl::encoding::ResourceTypeMarker for ComponentDiagnostics {
2584        type Borrowed<'a> = &'a mut Self;
2585        fn take_or_borrow<'a>(
2586            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2587        ) -> Self::Borrowed<'a> {
2588            value
2589        }
2590    }
2591
2592    unsafe impl fidl::encoding::TypeMarker for ComponentDiagnostics {
2593        type Owned = Self;
2594
2595        #[inline(always)]
2596        fn inline_align(_context: fidl::encoding::Context) -> usize {
2597            8
2598        }
2599
2600        #[inline(always)]
2601        fn inline_size(_context: fidl::encoding::Context) -> usize {
2602            16
2603        }
2604    }
2605
2606    unsafe impl
2607        fidl::encoding::Encode<ComponentDiagnostics, fidl::encoding::DefaultFuchsiaResourceDialect>
2608        for &mut ComponentDiagnostics
2609    {
2610        unsafe fn encode(
2611            self,
2612            encoder: &mut fidl::encoding::Encoder<
2613                '_,
2614                fidl::encoding::DefaultFuchsiaResourceDialect,
2615            >,
2616            offset: usize,
2617            mut depth: fidl::encoding::Depth,
2618        ) -> fidl::Result<()> {
2619            encoder.debug_check_bounds::<ComponentDiagnostics>(offset);
2620            // Vector header
2621            let max_ordinal: u64 = self.max_ordinal_present();
2622            encoder.write_num(max_ordinal, offset);
2623            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2624            // Calling encoder.out_of_line_offset(0) is not allowed.
2625            if max_ordinal == 0 {
2626                return Ok(());
2627            }
2628            depth.increment()?;
2629            let envelope_size = 8;
2630            let bytes_len = max_ordinal as usize * envelope_size;
2631            #[allow(unused_variables)]
2632            let offset = encoder.out_of_line_offset(bytes_len);
2633            let mut _prev_end_offset: usize = 0;
2634            if 1 > max_ordinal {
2635                return Ok(());
2636            }
2637
2638            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2639            // are envelope_size bytes.
2640            let cur_offset: usize = (1 - 1) * envelope_size;
2641
2642            // Zero reserved fields.
2643            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2644
2645            // Safety:
2646            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2647            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2648            //   envelope_size bytes, there is always sufficient room.
2649            fidl::encoding::encode_in_envelope_optional::<
2650                ComponentTasks,
2651                fidl::encoding::DefaultFuchsiaResourceDialect,
2652            >(
2653                self.tasks
2654                    .as_mut()
2655                    .map(<ComponentTasks as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
2656                encoder,
2657                offset + cur_offset,
2658                depth,
2659            )?;
2660
2661            _prev_end_offset = cur_offset + envelope_size;
2662
2663            Ok(())
2664        }
2665    }
2666
2667    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2668        for ComponentDiagnostics
2669    {
2670        #[inline(always)]
2671        fn new_empty() -> Self {
2672            Self::default()
2673        }
2674
2675        unsafe fn decode(
2676            &mut self,
2677            decoder: &mut fidl::encoding::Decoder<
2678                '_,
2679                fidl::encoding::DefaultFuchsiaResourceDialect,
2680            >,
2681            offset: usize,
2682            mut depth: fidl::encoding::Depth,
2683        ) -> fidl::Result<()> {
2684            decoder.debug_check_bounds::<Self>(offset);
2685            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2686                None => return Err(fidl::Error::NotNullable),
2687                Some(len) => len,
2688            };
2689            // Calling decoder.out_of_line_offset(0) is not allowed.
2690            if len == 0 {
2691                return Ok(());
2692            };
2693            depth.increment()?;
2694            let envelope_size = 8;
2695            let bytes_len = len * envelope_size;
2696            let offset = decoder.out_of_line_offset(bytes_len)?;
2697            // Decode the envelope for each type.
2698            let mut _next_ordinal_to_read = 0;
2699            let mut next_offset = offset;
2700            let end_offset = offset + bytes_len;
2701            _next_ordinal_to_read += 1;
2702            if next_offset >= end_offset {
2703                return Ok(());
2704            }
2705
2706            // Decode unknown envelopes for gaps in ordinals.
2707            while _next_ordinal_to_read < 1 {
2708                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2709                _next_ordinal_to_read += 1;
2710                next_offset += envelope_size;
2711            }
2712
2713            let next_out_of_line = decoder.next_out_of_line();
2714            let handles_before = decoder.remaining_handles();
2715            if let Some((inlined, num_bytes, num_handles)) =
2716                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2717            {
2718                let member_inline_size =
2719                    <ComponentTasks as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2720                if inlined != (member_inline_size <= 4) {
2721                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2722                }
2723                let inner_offset;
2724                let mut inner_depth = depth.clone();
2725                if inlined {
2726                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2727                    inner_offset = next_offset;
2728                } else {
2729                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2730                    inner_depth.increment()?;
2731                }
2732                let val_ref = self.tasks.get_or_insert_with(|| {
2733                    fidl::new_empty!(ComponentTasks, fidl::encoding::DefaultFuchsiaResourceDialect)
2734                });
2735                fidl::decode!(
2736                    ComponentTasks,
2737                    fidl::encoding::DefaultFuchsiaResourceDialect,
2738                    val_ref,
2739                    decoder,
2740                    inner_offset,
2741                    inner_depth
2742                )?;
2743                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2744                {
2745                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2746                }
2747                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2748                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2749                }
2750            }
2751
2752            next_offset += envelope_size;
2753
2754            // Decode the remaining unknown envelopes.
2755            while next_offset < end_offset {
2756                _next_ordinal_to_read += 1;
2757                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2758                next_offset += envelope_size;
2759            }
2760
2761            Ok(())
2762        }
2763    }
2764
2765    impl ComponentNamespaceEntry {
2766        #[inline(always)]
2767        fn max_ordinal_present(&self) -> u64 {
2768            if let Some(_) = self.directory {
2769                return 2;
2770            }
2771            if let Some(_) = self.path {
2772                return 1;
2773            }
2774            0
2775        }
2776    }
2777
2778    impl fidl::encoding::ResourceTypeMarker for ComponentNamespaceEntry {
2779        type Borrowed<'a> = &'a mut Self;
2780        fn take_or_borrow<'a>(
2781            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2782        ) -> Self::Borrowed<'a> {
2783            value
2784        }
2785    }
2786
2787    unsafe impl fidl::encoding::TypeMarker for ComponentNamespaceEntry {
2788        type Owned = Self;
2789
2790        #[inline(always)]
2791        fn inline_align(_context: fidl::encoding::Context) -> usize {
2792            8
2793        }
2794
2795        #[inline(always)]
2796        fn inline_size(_context: fidl::encoding::Context) -> usize {
2797            16
2798        }
2799    }
2800
2801    unsafe impl
2802        fidl::encoding::Encode<
2803            ComponentNamespaceEntry,
2804            fidl::encoding::DefaultFuchsiaResourceDialect,
2805        > for &mut ComponentNamespaceEntry
2806    {
2807        unsafe fn encode(
2808            self,
2809            encoder: &mut fidl::encoding::Encoder<
2810                '_,
2811                fidl::encoding::DefaultFuchsiaResourceDialect,
2812            >,
2813            offset: usize,
2814            mut depth: fidl::encoding::Depth,
2815        ) -> fidl::Result<()> {
2816            encoder.debug_check_bounds::<ComponentNamespaceEntry>(offset);
2817            // Vector header
2818            let max_ordinal: u64 = self.max_ordinal_present();
2819            encoder.write_num(max_ordinal, offset);
2820            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2821            // Calling encoder.out_of_line_offset(0) is not allowed.
2822            if max_ordinal == 0 {
2823                return Ok(());
2824            }
2825            depth.increment()?;
2826            let envelope_size = 8;
2827            let bytes_len = max_ordinal as usize * envelope_size;
2828            #[allow(unused_variables)]
2829            let offset = encoder.out_of_line_offset(bytes_len);
2830            let mut _prev_end_offset: usize = 0;
2831            if 1 > max_ordinal {
2832                return Ok(());
2833            }
2834
2835            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2836            // are envelope_size bytes.
2837            let cur_offset: usize = (1 - 1) * envelope_size;
2838
2839            // Zero reserved fields.
2840            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2841
2842            // Safety:
2843            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2844            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2845            //   envelope_size bytes, there is always sufficient room.
2846            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<4095>, fidl::encoding::DefaultFuchsiaResourceDialect>(
2847            self.path.as_ref().map(<fidl::encoding::BoundedString<4095> as fidl::encoding::ValueTypeMarker>::borrow),
2848            encoder, offset + cur_offset, depth
2849        )?;
2850
2851            _prev_end_offset = cur_offset + envelope_size;
2852            if 2 > max_ordinal {
2853                return Ok(());
2854            }
2855
2856            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2857            // are envelope_size bytes.
2858            let cur_offset: usize = (2 - 1) * envelope_size;
2859
2860            // Zero reserved fields.
2861            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2862
2863            // Safety:
2864            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2865            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2866            //   envelope_size bytes, there is always sufficient room.
2867            fidl::encoding::encode_in_envelope_optional::<
2868                fidl::encoding::Endpoint<
2869                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
2870                >,
2871                fidl::encoding::DefaultFuchsiaResourceDialect,
2872            >(
2873                self.directory.as_mut().map(
2874                    <fidl::encoding::Endpoint<
2875                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
2876                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
2877                ),
2878                encoder,
2879                offset + cur_offset,
2880                depth,
2881            )?;
2882
2883            _prev_end_offset = cur_offset + envelope_size;
2884
2885            Ok(())
2886        }
2887    }
2888
2889    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2890        for ComponentNamespaceEntry
2891    {
2892        #[inline(always)]
2893        fn new_empty() -> Self {
2894            Self::default()
2895        }
2896
2897        unsafe fn decode(
2898            &mut self,
2899            decoder: &mut fidl::encoding::Decoder<
2900                '_,
2901                fidl::encoding::DefaultFuchsiaResourceDialect,
2902            >,
2903            offset: usize,
2904            mut depth: fidl::encoding::Depth,
2905        ) -> fidl::Result<()> {
2906            decoder.debug_check_bounds::<Self>(offset);
2907            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2908                None => return Err(fidl::Error::NotNullable),
2909                Some(len) => len,
2910            };
2911            // Calling decoder.out_of_line_offset(0) is not allowed.
2912            if len == 0 {
2913                return Ok(());
2914            };
2915            depth.increment()?;
2916            let envelope_size = 8;
2917            let bytes_len = len * envelope_size;
2918            let offset = decoder.out_of_line_offset(bytes_len)?;
2919            // Decode the envelope for each type.
2920            let mut _next_ordinal_to_read = 0;
2921            let mut next_offset = offset;
2922            let end_offset = offset + bytes_len;
2923            _next_ordinal_to_read += 1;
2924            if next_offset >= end_offset {
2925                return Ok(());
2926            }
2927
2928            // Decode unknown envelopes for gaps in ordinals.
2929            while _next_ordinal_to_read < 1 {
2930                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2931                _next_ordinal_to_read += 1;
2932                next_offset += envelope_size;
2933            }
2934
2935            let next_out_of_line = decoder.next_out_of_line();
2936            let handles_before = decoder.remaining_handles();
2937            if let Some((inlined, num_bytes, num_handles)) =
2938                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2939            {
2940                let member_inline_size = <fidl::encoding::BoundedString<4095> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2941                if inlined != (member_inline_size <= 4) {
2942                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2943                }
2944                let inner_offset;
2945                let mut inner_depth = depth.clone();
2946                if inlined {
2947                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2948                    inner_offset = next_offset;
2949                } else {
2950                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2951                    inner_depth.increment()?;
2952                }
2953                let val_ref = self.path.get_or_insert_with(|| {
2954                    fidl::new_empty!(
2955                        fidl::encoding::BoundedString<4095>,
2956                        fidl::encoding::DefaultFuchsiaResourceDialect
2957                    )
2958                });
2959                fidl::decode!(
2960                    fidl::encoding::BoundedString<4095>,
2961                    fidl::encoding::DefaultFuchsiaResourceDialect,
2962                    val_ref,
2963                    decoder,
2964                    inner_offset,
2965                    inner_depth
2966                )?;
2967                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2968                {
2969                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2970                }
2971                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2972                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2973                }
2974            }
2975
2976            next_offset += envelope_size;
2977            _next_ordinal_to_read += 1;
2978            if next_offset >= end_offset {
2979                return Ok(());
2980            }
2981
2982            // Decode unknown envelopes for gaps in ordinals.
2983            while _next_ordinal_to_read < 2 {
2984                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2985                _next_ordinal_to_read += 1;
2986                next_offset += envelope_size;
2987            }
2988
2989            let next_out_of_line = decoder.next_out_of_line();
2990            let handles_before = decoder.remaining_handles();
2991            if let Some((inlined, num_bytes, num_handles)) =
2992                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2993            {
2994                let member_inline_size = <fidl::encoding::Endpoint<
2995                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
2996                > as fidl::encoding::TypeMarker>::inline_size(
2997                    decoder.context
2998                );
2999                if inlined != (member_inline_size <= 4) {
3000                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3001                }
3002                let inner_offset;
3003                let mut inner_depth = depth.clone();
3004                if inlined {
3005                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3006                    inner_offset = next_offset;
3007                } else {
3008                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3009                    inner_depth.increment()?;
3010                }
3011                let val_ref = self.directory.get_or_insert_with(|| {
3012                    fidl::new_empty!(
3013                        fidl::encoding::Endpoint<
3014                            fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
3015                        >,
3016                        fidl::encoding::DefaultFuchsiaResourceDialect
3017                    )
3018                });
3019                fidl::decode!(
3020                    fidl::encoding::Endpoint<
3021                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
3022                    >,
3023                    fidl::encoding::DefaultFuchsiaResourceDialect,
3024                    val_ref,
3025                    decoder,
3026                    inner_offset,
3027                    inner_depth
3028                )?;
3029                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3030                {
3031                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3032                }
3033                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3034                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3035                }
3036            }
3037
3038            next_offset += envelope_size;
3039
3040            // Decode the remaining unknown envelopes.
3041            while next_offset < end_offset {
3042                _next_ordinal_to_read += 1;
3043                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3044                next_offset += envelope_size;
3045            }
3046
3047            Ok(())
3048        }
3049    }
3050
3051    impl ComponentStartInfo {
3052        #[inline(always)]
3053        fn max_ordinal_present(&self) -> u64 {
3054            if let Some(_) = self.escrowed_dictionary {
3055                return 10;
3056            }
3057            if let Some(_) = self.component_instance {
3058                return 9;
3059            }
3060            if let Some(_) = self.break_on_start {
3061                return 8;
3062            }
3063            if let Some(_) = self.encoded_config {
3064                return 7;
3065            }
3066            if let Some(_) = self.numbered_handles {
3067                return 6;
3068            }
3069            if let Some(_) = self.runtime_dir {
3070                return 5;
3071            }
3072            if let Some(_) = self.outgoing_dir {
3073                return 4;
3074            }
3075            if let Some(_) = self.ns {
3076                return 3;
3077            }
3078            if let Some(_) = self.program {
3079                return 2;
3080            }
3081            if let Some(_) = self.resolved_url {
3082                return 1;
3083            }
3084            0
3085        }
3086    }
3087
3088    impl fidl::encoding::ResourceTypeMarker for ComponentStartInfo {
3089        type Borrowed<'a> = &'a mut Self;
3090        fn take_or_borrow<'a>(
3091            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
3092        ) -> Self::Borrowed<'a> {
3093            value
3094        }
3095    }
3096
3097    unsafe impl fidl::encoding::TypeMarker for ComponentStartInfo {
3098        type Owned = Self;
3099
3100        #[inline(always)]
3101        fn inline_align(_context: fidl::encoding::Context) -> usize {
3102            8
3103        }
3104
3105        #[inline(always)]
3106        fn inline_size(_context: fidl::encoding::Context) -> usize {
3107            16
3108        }
3109    }
3110
3111    unsafe impl
3112        fidl::encoding::Encode<ComponentStartInfo, fidl::encoding::DefaultFuchsiaResourceDialect>
3113        for &mut ComponentStartInfo
3114    {
3115        unsafe fn encode(
3116            self,
3117            encoder: &mut fidl::encoding::Encoder<
3118                '_,
3119                fidl::encoding::DefaultFuchsiaResourceDialect,
3120            >,
3121            offset: usize,
3122            mut depth: fidl::encoding::Depth,
3123        ) -> fidl::Result<()> {
3124            encoder.debug_check_bounds::<ComponentStartInfo>(offset);
3125            // Vector header
3126            let max_ordinal: u64 = self.max_ordinal_present();
3127            encoder.write_num(max_ordinal, offset);
3128            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3129            // Calling encoder.out_of_line_offset(0) is not allowed.
3130            if max_ordinal == 0 {
3131                return Ok(());
3132            }
3133            depth.increment()?;
3134            let envelope_size = 8;
3135            let bytes_len = max_ordinal as usize * envelope_size;
3136            #[allow(unused_variables)]
3137            let offset = encoder.out_of_line_offset(bytes_len);
3138            let mut _prev_end_offset: usize = 0;
3139            if 1 > max_ordinal {
3140                return Ok(());
3141            }
3142
3143            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3144            // are envelope_size bytes.
3145            let cur_offset: usize = (1 - 1) * envelope_size;
3146
3147            // Zero reserved fields.
3148            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3149
3150            // Safety:
3151            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3152            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3153            //   envelope_size bytes, there is always sufficient room.
3154            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<4096>, fidl::encoding::DefaultFuchsiaResourceDialect>(
3155            self.resolved_url.as_ref().map(<fidl::encoding::BoundedString<4096> as fidl::encoding::ValueTypeMarker>::borrow),
3156            encoder, offset + cur_offset, depth
3157        )?;
3158
3159            _prev_end_offset = cur_offset + envelope_size;
3160            if 2 > max_ordinal {
3161                return Ok(());
3162            }
3163
3164            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3165            // are envelope_size bytes.
3166            let cur_offset: usize = (2 - 1) * envelope_size;
3167
3168            // Zero reserved fields.
3169            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3170
3171            // Safety:
3172            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3173            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3174            //   envelope_size bytes, there is always sufficient room.
3175            fidl::encoding::encode_in_envelope_optional::<
3176                fidl_fuchsia_data::Dictionary,
3177                fidl::encoding::DefaultFuchsiaResourceDialect,
3178            >(
3179                self.program.as_ref().map(
3180                    <fidl_fuchsia_data::Dictionary as fidl::encoding::ValueTypeMarker>::borrow,
3181                ),
3182                encoder,
3183                offset + cur_offset,
3184                depth,
3185            )?;
3186
3187            _prev_end_offset = cur_offset + envelope_size;
3188            if 3 > max_ordinal {
3189                return Ok(());
3190            }
3191
3192            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3193            // are envelope_size bytes.
3194            let cur_offset: usize = (3 - 1) * envelope_size;
3195
3196            // Zero reserved fields.
3197            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3198
3199            // Safety:
3200            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3201            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3202            //   envelope_size bytes, there is always sufficient room.
3203            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<ComponentNamespaceEntry, 32>, fidl::encoding::DefaultFuchsiaResourceDialect>(
3204            self.ns.as_mut().map(<fidl::encoding::Vector<ComponentNamespaceEntry, 32> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
3205            encoder, offset + cur_offset, depth
3206        )?;
3207
3208            _prev_end_offset = cur_offset + envelope_size;
3209            if 4 > max_ordinal {
3210                return Ok(());
3211            }
3212
3213            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3214            // are envelope_size bytes.
3215            let cur_offset: usize = (4 - 1) * envelope_size;
3216
3217            // Zero reserved fields.
3218            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3219
3220            // Safety:
3221            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3222            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3223            //   envelope_size bytes, there is always sufficient room.
3224            fidl::encoding::encode_in_envelope_optional::<
3225                fidl::encoding::Endpoint<
3226                    fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3227                >,
3228                fidl::encoding::DefaultFuchsiaResourceDialect,
3229            >(
3230                self.outgoing_dir.as_mut().map(
3231                    <fidl::encoding::Endpoint<
3232                        fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3233                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
3234                ),
3235                encoder,
3236                offset + cur_offset,
3237                depth,
3238            )?;
3239
3240            _prev_end_offset = cur_offset + envelope_size;
3241            if 5 > max_ordinal {
3242                return Ok(());
3243            }
3244
3245            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3246            // are envelope_size bytes.
3247            let cur_offset: usize = (5 - 1) * envelope_size;
3248
3249            // Zero reserved fields.
3250            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3251
3252            // Safety:
3253            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3254            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3255            //   envelope_size bytes, there is always sufficient room.
3256            fidl::encoding::encode_in_envelope_optional::<
3257                fidl::encoding::Endpoint<
3258                    fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3259                >,
3260                fidl::encoding::DefaultFuchsiaResourceDialect,
3261            >(
3262                self.runtime_dir.as_mut().map(
3263                    <fidl::encoding::Endpoint<
3264                        fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3265                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
3266                ),
3267                encoder,
3268                offset + cur_offset,
3269                depth,
3270            )?;
3271
3272            _prev_end_offset = cur_offset + envelope_size;
3273            if 6 > max_ordinal {
3274                return Ok(());
3275            }
3276
3277            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3278            // are envelope_size bytes.
3279            let cur_offset: usize = (6 - 1) * envelope_size;
3280
3281            // Zero reserved fields.
3282            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3283
3284            // Safety:
3285            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3286            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3287            //   envelope_size bytes, there is always sufficient room.
3288            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<fidl_fuchsia_process::HandleInfo, 128>, fidl::encoding::DefaultFuchsiaResourceDialect>(
3289            self.numbered_handles.as_mut().map(<fidl::encoding::Vector<fidl_fuchsia_process::HandleInfo, 128> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
3290            encoder, offset + cur_offset, depth
3291        )?;
3292
3293            _prev_end_offset = cur_offset + envelope_size;
3294            if 7 > max_ordinal {
3295                return Ok(());
3296            }
3297
3298            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3299            // are envelope_size bytes.
3300            let cur_offset: usize = (7 - 1) * envelope_size;
3301
3302            // Zero reserved fields.
3303            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3304
3305            // Safety:
3306            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3307            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3308            //   envelope_size bytes, there is always sufficient room.
3309            fidl::encoding::encode_in_envelope_optional::<
3310                fidl_fuchsia_mem::Data,
3311                fidl::encoding::DefaultFuchsiaResourceDialect,
3312            >(
3313                self.encoded_config.as_mut().map(
3314                    <fidl_fuchsia_mem::Data as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
3315                ),
3316                encoder,
3317                offset + cur_offset,
3318                depth,
3319            )?;
3320
3321            _prev_end_offset = cur_offset + envelope_size;
3322            if 8 > max_ordinal {
3323                return Ok(());
3324            }
3325
3326            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3327            // are envelope_size bytes.
3328            let cur_offset: usize = (8 - 1) * envelope_size;
3329
3330            // Zero reserved fields.
3331            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3332
3333            // Safety:
3334            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3335            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3336            //   envelope_size bytes, there is always sufficient room.
3337            fidl::encoding::encode_in_envelope_optional::<
3338                fidl::encoding::HandleType<
3339                    fidl::EventPair,
3340                    { fidl::ObjectType::EVENTPAIR.into_raw() },
3341                    2147483648,
3342                >,
3343                fidl::encoding::DefaultFuchsiaResourceDialect,
3344            >(
3345                self.break_on_start.as_mut().map(
3346                    <fidl::encoding::HandleType<
3347                        fidl::EventPair,
3348                        { fidl::ObjectType::EVENTPAIR.into_raw() },
3349                        2147483648,
3350                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
3351                ),
3352                encoder,
3353                offset + cur_offset,
3354                depth,
3355            )?;
3356
3357            _prev_end_offset = cur_offset + envelope_size;
3358            if 9 > max_ordinal {
3359                return Ok(());
3360            }
3361
3362            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3363            // are envelope_size bytes.
3364            let cur_offset: usize = (9 - 1) * envelope_size;
3365
3366            // Zero reserved fields.
3367            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3368
3369            // Safety:
3370            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3371            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3372            //   envelope_size bytes, there is always sufficient room.
3373            fidl::encoding::encode_in_envelope_optional::<
3374                fidl::encoding::HandleType<
3375                    fidl::Event,
3376                    { fidl::ObjectType::EVENT.into_raw() },
3377                    2147483648,
3378                >,
3379                fidl::encoding::DefaultFuchsiaResourceDialect,
3380            >(
3381                self.component_instance.as_mut().map(
3382                    <fidl::encoding::HandleType<
3383                        fidl::Event,
3384                        { fidl::ObjectType::EVENT.into_raw() },
3385                        2147483648,
3386                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
3387                ),
3388                encoder,
3389                offset + cur_offset,
3390                depth,
3391            )?;
3392
3393            _prev_end_offset = cur_offset + envelope_size;
3394            if 10 > max_ordinal {
3395                return Ok(());
3396            }
3397
3398            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3399            // are envelope_size bytes.
3400            let cur_offset: usize = (10 - 1) * envelope_size;
3401
3402            // Zero reserved fields.
3403            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3404
3405            // Safety:
3406            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3407            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3408            //   envelope_size bytes, there is always sufficient room.
3409            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_component_sandbox::DictionaryRef, fidl::encoding::DefaultFuchsiaResourceDialect>(
3410            self.escrowed_dictionary.as_mut().map(<fidl_fuchsia_component_sandbox::DictionaryRef as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
3411            encoder, offset + cur_offset, depth
3412        )?;
3413
3414            _prev_end_offset = cur_offset + envelope_size;
3415
3416            Ok(())
3417        }
3418    }
3419
3420    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
3421        for ComponentStartInfo
3422    {
3423        #[inline(always)]
3424        fn new_empty() -> Self {
3425            Self::default()
3426        }
3427
3428        unsafe fn decode(
3429            &mut self,
3430            decoder: &mut fidl::encoding::Decoder<
3431                '_,
3432                fidl::encoding::DefaultFuchsiaResourceDialect,
3433            >,
3434            offset: usize,
3435            mut depth: fidl::encoding::Depth,
3436        ) -> fidl::Result<()> {
3437            decoder.debug_check_bounds::<Self>(offset);
3438            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3439                None => return Err(fidl::Error::NotNullable),
3440                Some(len) => len,
3441            };
3442            // Calling decoder.out_of_line_offset(0) is not allowed.
3443            if len == 0 {
3444                return Ok(());
3445            };
3446            depth.increment()?;
3447            let envelope_size = 8;
3448            let bytes_len = len * envelope_size;
3449            let offset = decoder.out_of_line_offset(bytes_len)?;
3450            // Decode the envelope for each type.
3451            let mut _next_ordinal_to_read = 0;
3452            let mut next_offset = offset;
3453            let end_offset = offset + bytes_len;
3454            _next_ordinal_to_read += 1;
3455            if next_offset >= end_offset {
3456                return Ok(());
3457            }
3458
3459            // Decode unknown envelopes for gaps in ordinals.
3460            while _next_ordinal_to_read < 1 {
3461                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3462                _next_ordinal_to_read += 1;
3463                next_offset += envelope_size;
3464            }
3465
3466            let next_out_of_line = decoder.next_out_of_line();
3467            let handles_before = decoder.remaining_handles();
3468            if let Some((inlined, num_bytes, num_handles)) =
3469                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3470            {
3471                let member_inline_size = <fidl::encoding::BoundedString<4096> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3472                if inlined != (member_inline_size <= 4) {
3473                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3474                }
3475                let inner_offset;
3476                let mut inner_depth = depth.clone();
3477                if inlined {
3478                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3479                    inner_offset = next_offset;
3480                } else {
3481                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3482                    inner_depth.increment()?;
3483                }
3484                let val_ref = self.resolved_url.get_or_insert_with(|| {
3485                    fidl::new_empty!(
3486                        fidl::encoding::BoundedString<4096>,
3487                        fidl::encoding::DefaultFuchsiaResourceDialect
3488                    )
3489                });
3490                fidl::decode!(
3491                    fidl::encoding::BoundedString<4096>,
3492                    fidl::encoding::DefaultFuchsiaResourceDialect,
3493                    val_ref,
3494                    decoder,
3495                    inner_offset,
3496                    inner_depth
3497                )?;
3498                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3499                {
3500                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3501                }
3502                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3503                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3504                }
3505            }
3506
3507            next_offset += envelope_size;
3508            _next_ordinal_to_read += 1;
3509            if next_offset >= end_offset {
3510                return Ok(());
3511            }
3512
3513            // Decode unknown envelopes for gaps in ordinals.
3514            while _next_ordinal_to_read < 2 {
3515                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3516                _next_ordinal_to_read += 1;
3517                next_offset += envelope_size;
3518            }
3519
3520            let next_out_of_line = decoder.next_out_of_line();
3521            let handles_before = decoder.remaining_handles();
3522            if let Some((inlined, num_bytes, num_handles)) =
3523                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3524            {
3525                let member_inline_size =
3526                    <fidl_fuchsia_data::Dictionary as fidl::encoding::TypeMarker>::inline_size(
3527                        decoder.context,
3528                    );
3529                if inlined != (member_inline_size <= 4) {
3530                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3531                }
3532                let inner_offset;
3533                let mut inner_depth = depth.clone();
3534                if inlined {
3535                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3536                    inner_offset = next_offset;
3537                } else {
3538                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3539                    inner_depth.increment()?;
3540                }
3541                let val_ref = self.program.get_or_insert_with(|| {
3542                    fidl::new_empty!(
3543                        fidl_fuchsia_data::Dictionary,
3544                        fidl::encoding::DefaultFuchsiaResourceDialect
3545                    )
3546                });
3547                fidl::decode!(
3548                    fidl_fuchsia_data::Dictionary,
3549                    fidl::encoding::DefaultFuchsiaResourceDialect,
3550                    val_ref,
3551                    decoder,
3552                    inner_offset,
3553                    inner_depth
3554                )?;
3555                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3556                {
3557                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3558                }
3559                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3560                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3561                }
3562            }
3563
3564            next_offset += envelope_size;
3565            _next_ordinal_to_read += 1;
3566            if next_offset >= end_offset {
3567                return Ok(());
3568            }
3569
3570            // Decode unknown envelopes for gaps in ordinals.
3571            while _next_ordinal_to_read < 3 {
3572                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3573                _next_ordinal_to_read += 1;
3574                next_offset += envelope_size;
3575            }
3576
3577            let next_out_of_line = decoder.next_out_of_line();
3578            let handles_before = decoder.remaining_handles();
3579            if let Some((inlined, num_bytes, num_handles)) =
3580                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3581            {
3582                let member_inline_size = <fidl::encoding::Vector<ComponentNamespaceEntry, 32> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3583                if inlined != (member_inline_size <= 4) {
3584                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3585                }
3586                let inner_offset;
3587                let mut inner_depth = depth.clone();
3588                if inlined {
3589                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3590                    inner_offset = next_offset;
3591                } else {
3592                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3593                    inner_depth.increment()?;
3594                }
3595                let val_ref =
3596                self.ns.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<ComponentNamespaceEntry, 32>, fidl::encoding::DefaultFuchsiaResourceDialect));
3597                fidl::decode!(fidl::encoding::Vector<ComponentNamespaceEntry, 32>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
3598                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3599                {
3600                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3601                }
3602                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3603                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3604                }
3605            }
3606
3607            next_offset += envelope_size;
3608            _next_ordinal_to_read += 1;
3609            if next_offset >= end_offset {
3610                return Ok(());
3611            }
3612
3613            // Decode unknown envelopes for gaps in ordinals.
3614            while _next_ordinal_to_read < 4 {
3615                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3616                _next_ordinal_to_read += 1;
3617                next_offset += envelope_size;
3618            }
3619
3620            let next_out_of_line = decoder.next_out_of_line();
3621            let handles_before = decoder.remaining_handles();
3622            if let Some((inlined, num_bytes, num_handles)) =
3623                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3624            {
3625                let member_inline_size = <fidl::encoding::Endpoint<
3626                    fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3627                > as fidl::encoding::TypeMarker>::inline_size(
3628                    decoder.context
3629                );
3630                if inlined != (member_inline_size <= 4) {
3631                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3632                }
3633                let inner_offset;
3634                let mut inner_depth = depth.clone();
3635                if inlined {
3636                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3637                    inner_offset = next_offset;
3638                } else {
3639                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3640                    inner_depth.increment()?;
3641                }
3642                let val_ref = self.outgoing_dir.get_or_insert_with(|| {
3643                    fidl::new_empty!(
3644                        fidl::encoding::Endpoint<
3645                            fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3646                        >,
3647                        fidl::encoding::DefaultFuchsiaResourceDialect
3648                    )
3649                });
3650                fidl::decode!(
3651                    fidl::encoding::Endpoint<
3652                        fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3653                    >,
3654                    fidl::encoding::DefaultFuchsiaResourceDialect,
3655                    val_ref,
3656                    decoder,
3657                    inner_offset,
3658                    inner_depth
3659                )?;
3660                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3661                {
3662                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3663                }
3664                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3665                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3666                }
3667            }
3668
3669            next_offset += envelope_size;
3670            _next_ordinal_to_read += 1;
3671            if next_offset >= end_offset {
3672                return Ok(());
3673            }
3674
3675            // Decode unknown envelopes for gaps in ordinals.
3676            while _next_ordinal_to_read < 5 {
3677                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3678                _next_ordinal_to_read += 1;
3679                next_offset += envelope_size;
3680            }
3681
3682            let next_out_of_line = decoder.next_out_of_line();
3683            let handles_before = decoder.remaining_handles();
3684            if let Some((inlined, num_bytes, num_handles)) =
3685                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3686            {
3687                let member_inline_size = <fidl::encoding::Endpoint<
3688                    fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3689                > as fidl::encoding::TypeMarker>::inline_size(
3690                    decoder.context
3691                );
3692                if inlined != (member_inline_size <= 4) {
3693                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3694                }
3695                let inner_offset;
3696                let mut inner_depth = depth.clone();
3697                if inlined {
3698                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3699                    inner_offset = next_offset;
3700                } else {
3701                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3702                    inner_depth.increment()?;
3703                }
3704                let val_ref = self.runtime_dir.get_or_insert_with(|| {
3705                    fidl::new_empty!(
3706                        fidl::encoding::Endpoint<
3707                            fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3708                        >,
3709                        fidl::encoding::DefaultFuchsiaResourceDialect
3710                    )
3711                });
3712                fidl::decode!(
3713                    fidl::encoding::Endpoint<
3714                        fidl::endpoints::ServerEnd<fidl_fuchsia_io::DirectoryMarker>,
3715                    >,
3716                    fidl::encoding::DefaultFuchsiaResourceDialect,
3717                    val_ref,
3718                    decoder,
3719                    inner_offset,
3720                    inner_depth
3721                )?;
3722                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3723                {
3724                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3725                }
3726                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3727                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3728                }
3729            }
3730
3731            next_offset += envelope_size;
3732            _next_ordinal_to_read += 1;
3733            if next_offset >= end_offset {
3734                return Ok(());
3735            }
3736
3737            // Decode unknown envelopes for gaps in ordinals.
3738            while _next_ordinal_to_read < 6 {
3739                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3740                _next_ordinal_to_read += 1;
3741                next_offset += envelope_size;
3742            }
3743
3744            let next_out_of_line = decoder.next_out_of_line();
3745            let handles_before = decoder.remaining_handles();
3746            if let Some((inlined, num_bytes, num_handles)) =
3747                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3748            {
3749                let member_inline_size = <fidl::encoding::Vector<
3750                    fidl_fuchsia_process::HandleInfo,
3751                    128,
3752                > as fidl::encoding::TypeMarker>::inline_size(
3753                    decoder.context
3754                );
3755                if inlined != (member_inline_size <= 4) {
3756                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3757                }
3758                let inner_offset;
3759                let mut inner_depth = depth.clone();
3760                if inlined {
3761                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3762                    inner_offset = next_offset;
3763                } else {
3764                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3765                    inner_depth.increment()?;
3766                }
3767                let val_ref =
3768                self.numbered_handles.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<fidl_fuchsia_process::HandleInfo, 128>, fidl::encoding::DefaultFuchsiaResourceDialect));
3769                fidl::decode!(fidl::encoding::Vector<fidl_fuchsia_process::HandleInfo, 128>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
3770                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3771                {
3772                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3773                }
3774                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3775                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3776                }
3777            }
3778
3779            next_offset += envelope_size;
3780            _next_ordinal_to_read += 1;
3781            if next_offset >= end_offset {
3782                return Ok(());
3783            }
3784
3785            // Decode unknown envelopes for gaps in ordinals.
3786            while _next_ordinal_to_read < 7 {
3787                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3788                _next_ordinal_to_read += 1;
3789                next_offset += envelope_size;
3790            }
3791
3792            let next_out_of_line = decoder.next_out_of_line();
3793            let handles_before = decoder.remaining_handles();
3794            if let Some((inlined, num_bytes, num_handles)) =
3795                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3796            {
3797                let member_inline_size =
3798                    <fidl_fuchsia_mem::Data as fidl::encoding::TypeMarker>::inline_size(
3799                        decoder.context,
3800                    );
3801                if inlined != (member_inline_size <= 4) {
3802                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3803                }
3804                let inner_offset;
3805                let mut inner_depth = depth.clone();
3806                if inlined {
3807                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3808                    inner_offset = next_offset;
3809                } else {
3810                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3811                    inner_depth.increment()?;
3812                }
3813                let val_ref = self.encoded_config.get_or_insert_with(|| {
3814                    fidl::new_empty!(
3815                        fidl_fuchsia_mem::Data,
3816                        fidl::encoding::DefaultFuchsiaResourceDialect
3817                    )
3818                });
3819                fidl::decode!(
3820                    fidl_fuchsia_mem::Data,
3821                    fidl::encoding::DefaultFuchsiaResourceDialect,
3822                    val_ref,
3823                    decoder,
3824                    inner_offset,
3825                    inner_depth
3826                )?;
3827                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3828                {
3829                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3830                }
3831                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3832                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3833                }
3834            }
3835
3836            next_offset += envelope_size;
3837            _next_ordinal_to_read += 1;
3838            if next_offset >= end_offset {
3839                return Ok(());
3840            }
3841
3842            // Decode unknown envelopes for gaps in ordinals.
3843            while _next_ordinal_to_read < 8 {
3844                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3845                _next_ordinal_to_read += 1;
3846                next_offset += envelope_size;
3847            }
3848
3849            let next_out_of_line = decoder.next_out_of_line();
3850            let handles_before = decoder.remaining_handles();
3851            if let Some((inlined, num_bytes, num_handles)) =
3852                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3853            {
3854                let member_inline_size = <fidl::encoding::HandleType<
3855                    fidl::EventPair,
3856                    { fidl::ObjectType::EVENTPAIR.into_raw() },
3857                    2147483648,
3858                > as fidl::encoding::TypeMarker>::inline_size(
3859                    decoder.context
3860                );
3861                if inlined != (member_inline_size <= 4) {
3862                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3863                }
3864                let inner_offset;
3865                let mut inner_depth = depth.clone();
3866                if inlined {
3867                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3868                    inner_offset = next_offset;
3869                } else {
3870                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3871                    inner_depth.increment()?;
3872                }
3873                let val_ref =
3874                self.break_on_start.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
3875                fidl::decode!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
3876                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3877                {
3878                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3879                }
3880                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3881                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3882                }
3883            }
3884
3885            next_offset += envelope_size;
3886            _next_ordinal_to_read += 1;
3887            if next_offset >= end_offset {
3888                return Ok(());
3889            }
3890
3891            // Decode unknown envelopes for gaps in ordinals.
3892            while _next_ordinal_to_read < 9 {
3893                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3894                _next_ordinal_to_read += 1;
3895                next_offset += envelope_size;
3896            }
3897
3898            let next_out_of_line = decoder.next_out_of_line();
3899            let handles_before = decoder.remaining_handles();
3900            if let Some((inlined, num_bytes, num_handles)) =
3901                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3902            {
3903                let member_inline_size = <fidl::encoding::HandleType<
3904                    fidl::Event,
3905                    { fidl::ObjectType::EVENT.into_raw() },
3906                    2147483648,
3907                > as fidl::encoding::TypeMarker>::inline_size(
3908                    decoder.context
3909                );
3910                if inlined != (member_inline_size <= 4) {
3911                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3912                }
3913                let inner_offset;
3914                let mut inner_depth = depth.clone();
3915                if inlined {
3916                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3917                    inner_offset = next_offset;
3918                } else {
3919                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3920                    inner_depth.increment()?;
3921                }
3922                let val_ref =
3923                self.component_instance.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
3924                fidl::decode!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
3925                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3926                {
3927                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3928                }
3929                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3930                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3931                }
3932            }
3933
3934            next_offset += envelope_size;
3935            _next_ordinal_to_read += 1;
3936            if next_offset >= end_offset {
3937                return Ok(());
3938            }
3939
3940            // Decode unknown envelopes for gaps in ordinals.
3941            while _next_ordinal_to_read < 10 {
3942                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3943                _next_ordinal_to_read += 1;
3944                next_offset += envelope_size;
3945            }
3946
3947            let next_out_of_line = decoder.next_out_of_line();
3948            let handles_before = decoder.remaining_handles();
3949            if let Some((inlined, num_bytes, num_handles)) =
3950                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3951            {
3952                let member_inline_size = <fidl_fuchsia_component_sandbox::DictionaryRef as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3953                if inlined != (member_inline_size <= 4) {
3954                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3955                }
3956                let inner_offset;
3957                let mut inner_depth = depth.clone();
3958                if inlined {
3959                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3960                    inner_offset = next_offset;
3961                } else {
3962                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3963                    inner_depth.increment()?;
3964                }
3965                let val_ref = self.escrowed_dictionary.get_or_insert_with(|| {
3966                    fidl::new_empty!(
3967                        fidl_fuchsia_component_sandbox::DictionaryRef,
3968                        fidl::encoding::DefaultFuchsiaResourceDialect
3969                    )
3970                });
3971                fidl::decode!(
3972                    fidl_fuchsia_component_sandbox::DictionaryRef,
3973                    fidl::encoding::DefaultFuchsiaResourceDialect,
3974                    val_ref,
3975                    decoder,
3976                    inner_offset,
3977                    inner_depth
3978                )?;
3979                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3980                {
3981                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3982                }
3983                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3984                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3985                }
3986            }
3987
3988            next_offset += envelope_size;
3989
3990            // Decode the remaining unknown envelopes.
3991            while next_offset < end_offset {
3992                _next_ordinal_to_read += 1;
3993                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3994                next_offset += envelope_size;
3995            }
3996
3997            Ok(())
3998        }
3999    }
4000
4001    impl ComponentStopInfo {
4002        #[inline(always)]
4003        fn max_ordinal_present(&self) -> u64 {
4004            if let Some(_) = self.exit_code {
4005                return 2;
4006            }
4007            if let Some(_) = self.termination_status {
4008                return 1;
4009            }
4010            0
4011        }
4012    }
4013
4014    impl fidl::encoding::ResourceTypeMarker for ComponentStopInfo {
4015        type Borrowed<'a> = &'a mut Self;
4016        fn take_or_borrow<'a>(
4017            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
4018        ) -> Self::Borrowed<'a> {
4019            value
4020        }
4021    }
4022
4023    unsafe impl fidl::encoding::TypeMarker for ComponentStopInfo {
4024        type Owned = Self;
4025
4026        #[inline(always)]
4027        fn inline_align(_context: fidl::encoding::Context) -> usize {
4028            8
4029        }
4030
4031        #[inline(always)]
4032        fn inline_size(_context: fidl::encoding::Context) -> usize {
4033            16
4034        }
4035    }
4036
4037    unsafe impl
4038        fidl::encoding::Encode<ComponentStopInfo, fidl::encoding::DefaultFuchsiaResourceDialect>
4039        for &mut ComponentStopInfo
4040    {
4041        unsafe fn encode(
4042            self,
4043            encoder: &mut fidl::encoding::Encoder<
4044                '_,
4045                fidl::encoding::DefaultFuchsiaResourceDialect,
4046            >,
4047            offset: usize,
4048            mut depth: fidl::encoding::Depth,
4049        ) -> fidl::Result<()> {
4050            encoder.debug_check_bounds::<ComponentStopInfo>(offset);
4051            // Vector header
4052            let max_ordinal: u64 = self.max_ordinal_present();
4053            encoder.write_num(max_ordinal, offset);
4054            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4055            // Calling encoder.out_of_line_offset(0) is not allowed.
4056            if max_ordinal == 0 {
4057                return Ok(());
4058            }
4059            depth.increment()?;
4060            let envelope_size = 8;
4061            let bytes_len = max_ordinal as usize * envelope_size;
4062            #[allow(unused_variables)]
4063            let offset = encoder.out_of_line_offset(bytes_len);
4064            let mut _prev_end_offset: usize = 0;
4065            if 1 > max_ordinal {
4066                return Ok(());
4067            }
4068
4069            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4070            // are envelope_size bytes.
4071            let cur_offset: usize = (1 - 1) * envelope_size;
4072
4073            // Zero reserved fields.
4074            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4075
4076            // Safety:
4077            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4078            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4079            //   envelope_size bytes, there is always sufficient room.
4080            fidl::encoding::encode_in_envelope_optional::<
4081                i32,
4082                fidl::encoding::DefaultFuchsiaResourceDialect,
4083            >(
4084                self.termination_status
4085                    .as_ref()
4086                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
4087                encoder,
4088                offset + cur_offset,
4089                depth,
4090            )?;
4091
4092            _prev_end_offset = cur_offset + envelope_size;
4093            if 2 > max_ordinal {
4094                return Ok(());
4095            }
4096
4097            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4098            // are envelope_size bytes.
4099            let cur_offset: usize = (2 - 1) * envelope_size;
4100
4101            // Zero reserved fields.
4102            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4103
4104            // Safety:
4105            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4106            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4107            //   envelope_size bytes, there is always sufficient room.
4108            fidl::encoding::encode_in_envelope_optional::<
4109                i64,
4110                fidl::encoding::DefaultFuchsiaResourceDialect,
4111            >(
4112                self.exit_code.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
4113                encoder,
4114                offset + cur_offset,
4115                depth,
4116            )?;
4117
4118            _prev_end_offset = cur_offset + envelope_size;
4119
4120            Ok(())
4121        }
4122    }
4123
4124    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
4125        for ComponentStopInfo
4126    {
4127        #[inline(always)]
4128        fn new_empty() -> Self {
4129            Self::default()
4130        }
4131
4132        unsafe fn decode(
4133            &mut self,
4134            decoder: &mut fidl::encoding::Decoder<
4135                '_,
4136                fidl::encoding::DefaultFuchsiaResourceDialect,
4137            >,
4138            offset: usize,
4139            mut depth: fidl::encoding::Depth,
4140        ) -> fidl::Result<()> {
4141            decoder.debug_check_bounds::<Self>(offset);
4142            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4143                None => return Err(fidl::Error::NotNullable),
4144                Some(len) => len,
4145            };
4146            // Calling decoder.out_of_line_offset(0) is not allowed.
4147            if len == 0 {
4148                return Ok(());
4149            };
4150            depth.increment()?;
4151            let envelope_size = 8;
4152            let bytes_len = len * envelope_size;
4153            let offset = decoder.out_of_line_offset(bytes_len)?;
4154            // Decode the envelope for each type.
4155            let mut _next_ordinal_to_read = 0;
4156            let mut next_offset = offset;
4157            let end_offset = offset + bytes_len;
4158            _next_ordinal_to_read += 1;
4159            if next_offset >= end_offset {
4160                return Ok(());
4161            }
4162
4163            // Decode unknown envelopes for gaps in ordinals.
4164            while _next_ordinal_to_read < 1 {
4165                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4166                _next_ordinal_to_read += 1;
4167                next_offset += envelope_size;
4168            }
4169
4170            let next_out_of_line = decoder.next_out_of_line();
4171            let handles_before = decoder.remaining_handles();
4172            if let Some((inlined, num_bytes, num_handles)) =
4173                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4174            {
4175                let member_inline_size =
4176                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4177                if inlined != (member_inline_size <= 4) {
4178                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4179                }
4180                let inner_offset;
4181                let mut inner_depth = depth.clone();
4182                if inlined {
4183                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4184                    inner_offset = next_offset;
4185                } else {
4186                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4187                    inner_depth.increment()?;
4188                }
4189                let val_ref = self.termination_status.get_or_insert_with(|| {
4190                    fidl::new_empty!(i32, fidl::encoding::DefaultFuchsiaResourceDialect)
4191                });
4192                fidl::decode!(
4193                    i32,
4194                    fidl::encoding::DefaultFuchsiaResourceDialect,
4195                    val_ref,
4196                    decoder,
4197                    inner_offset,
4198                    inner_depth
4199                )?;
4200                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4201                {
4202                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4203                }
4204                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4205                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4206                }
4207            }
4208
4209            next_offset += envelope_size;
4210            _next_ordinal_to_read += 1;
4211            if next_offset >= end_offset {
4212                return Ok(());
4213            }
4214
4215            // Decode unknown envelopes for gaps in ordinals.
4216            while _next_ordinal_to_read < 2 {
4217                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4218                _next_ordinal_to_read += 1;
4219                next_offset += envelope_size;
4220            }
4221
4222            let next_out_of_line = decoder.next_out_of_line();
4223            let handles_before = decoder.remaining_handles();
4224            if let Some((inlined, num_bytes, num_handles)) =
4225                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4226            {
4227                let member_inline_size =
4228                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4229                if inlined != (member_inline_size <= 4) {
4230                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4231                }
4232                let inner_offset;
4233                let mut inner_depth = depth.clone();
4234                if inlined {
4235                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4236                    inner_offset = next_offset;
4237                } else {
4238                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4239                    inner_depth.increment()?;
4240                }
4241                let val_ref = self.exit_code.get_or_insert_with(|| {
4242                    fidl::new_empty!(i64, fidl::encoding::DefaultFuchsiaResourceDialect)
4243                });
4244                fidl::decode!(
4245                    i64,
4246                    fidl::encoding::DefaultFuchsiaResourceDialect,
4247                    val_ref,
4248                    decoder,
4249                    inner_offset,
4250                    inner_depth
4251                )?;
4252                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4253                {
4254                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4255                }
4256                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4257                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4258                }
4259            }
4260
4261            next_offset += envelope_size;
4262
4263            // Decode the remaining unknown envelopes.
4264            while next_offset < end_offset {
4265                _next_ordinal_to_read += 1;
4266                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4267                next_offset += envelope_size;
4268            }
4269
4270            Ok(())
4271        }
4272    }
4273
4274    impl ComponentTasks {
4275        #[inline(always)]
4276        fn max_ordinal_present(&self) -> u64 {
4277            if let Some(_) = self.parent_task {
4278                return 2;
4279            }
4280            if let Some(_) = self.component_task {
4281                return 1;
4282            }
4283            0
4284        }
4285    }
4286
4287    impl fidl::encoding::ResourceTypeMarker for ComponentTasks {
4288        type Borrowed<'a> = &'a mut Self;
4289        fn take_or_borrow<'a>(
4290            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
4291        ) -> Self::Borrowed<'a> {
4292            value
4293        }
4294    }
4295
4296    unsafe impl fidl::encoding::TypeMarker for ComponentTasks {
4297        type Owned = Self;
4298
4299        #[inline(always)]
4300        fn inline_align(_context: fidl::encoding::Context) -> usize {
4301            8
4302        }
4303
4304        #[inline(always)]
4305        fn inline_size(_context: fidl::encoding::Context) -> usize {
4306            16
4307        }
4308    }
4309
4310    unsafe impl
4311        fidl::encoding::Encode<ComponentTasks, fidl::encoding::DefaultFuchsiaResourceDialect>
4312        for &mut ComponentTasks
4313    {
4314        unsafe fn encode(
4315            self,
4316            encoder: &mut fidl::encoding::Encoder<
4317                '_,
4318                fidl::encoding::DefaultFuchsiaResourceDialect,
4319            >,
4320            offset: usize,
4321            mut depth: fidl::encoding::Depth,
4322        ) -> fidl::Result<()> {
4323            encoder.debug_check_bounds::<ComponentTasks>(offset);
4324            // Vector header
4325            let max_ordinal: u64 = self.max_ordinal_present();
4326            encoder.write_num(max_ordinal, offset);
4327            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4328            // Calling encoder.out_of_line_offset(0) is not allowed.
4329            if max_ordinal == 0 {
4330                return Ok(());
4331            }
4332            depth.increment()?;
4333            let envelope_size = 8;
4334            let bytes_len = max_ordinal as usize * envelope_size;
4335            #[allow(unused_variables)]
4336            let offset = encoder.out_of_line_offset(bytes_len);
4337            let mut _prev_end_offset: usize = 0;
4338            if 1 > max_ordinal {
4339                return Ok(());
4340            }
4341
4342            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4343            // are envelope_size bytes.
4344            let cur_offset: usize = (1 - 1) * envelope_size;
4345
4346            // Zero reserved fields.
4347            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4348
4349            // Safety:
4350            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4351            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4352            //   envelope_size bytes, there is always sufficient room.
4353            fidl::encoding::encode_in_envelope_optional::<
4354                Task,
4355                fidl::encoding::DefaultFuchsiaResourceDialect,
4356            >(
4357                self.component_task
4358                    .as_mut()
4359                    .map(<Task as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
4360                encoder,
4361                offset + cur_offset,
4362                depth,
4363            )?;
4364
4365            _prev_end_offset = cur_offset + envelope_size;
4366            if 2 > max_ordinal {
4367                return Ok(());
4368            }
4369
4370            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4371            // are envelope_size bytes.
4372            let cur_offset: usize = (2 - 1) * envelope_size;
4373
4374            // Zero reserved fields.
4375            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4376
4377            // Safety:
4378            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4379            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4380            //   envelope_size bytes, there is always sufficient room.
4381            fidl::encoding::encode_in_envelope_optional::<
4382                Task,
4383                fidl::encoding::DefaultFuchsiaResourceDialect,
4384            >(
4385                self.parent_task
4386                    .as_mut()
4387                    .map(<Task as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
4388                encoder,
4389                offset + cur_offset,
4390                depth,
4391            )?;
4392
4393            _prev_end_offset = cur_offset + envelope_size;
4394
4395            Ok(())
4396        }
4397    }
4398
4399    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
4400        for ComponentTasks
4401    {
4402        #[inline(always)]
4403        fn new_empty() -> Self {
4404            Self::default()
4405        }
4406
4407        unsafe fn decode(
4408            &mut self,
4409            decoder: &mut fidl::encoding::Decoder<
4410                '_,
4411                fidl::encoding::DefaultFuchsiaResourceDialect,
4412            >,
4413            offset: usize,
4414            mut depth: fidl::encoding::Depth,
4415        ) -> fidl::Result<()> {
4416            decoder.debug_check_bounds::<Self>(offset);
4417            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4418                None => return Err(fidl::Error::NotNullable),
4419                Some(len) => len,
4420            };
4421            // Calling decoder.out_of_line_offset(0) is not allowed.
4422            if len == 0 {
4423                return Ok(());
4424            };
4425            depth.increment()?;
4426            let envelope_size = 8;
4427            let bytes_len = len * envelope_size;
4428            let offset = decoder.out_of_line_offset(bytes_len)?;
4429            // Decode the envelope for each type.
4430            let mut _next_ordinal_to_read = 0;
4431            let mut next_offset = offset;
4432            let end_offset = offset + bytes_len;
4433            _next_ordinal_to_read += 1;
4434            if next_offset >= end_offset {
4435                return Ok(());
4436            }
4437
4438            // Decode unknown envelopes for gaps in ordinals.
4439            while _next_ordinal_to_read < 1 {
4440                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4441                _next_ordinal_to_read += 1;
4442                next_offset += envelope_size;
4443            }
4444
4445            let next_out_of_line = decoder.next_out_of_line();
4446            let handles_before = decoder.remaining_handles();
4447            if let Some((inlined, num_bytes, num_handles)) =
4448                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4449            {
4450                let member_inline_size =
4451                    <Task as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4452                if inlined != (member_inline_size <= 4) {
4453                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4454                }
4455                let inner_offset;
4456                let mut inner_depth = depth.clone();
4457                if inlined {
4458                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4459                    inner_offset = next_offset;
4460                } else {
4461                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4462                    inner_depth.increment()?;
4463                }
4464                let val_ref = self.component_task.get_or_insert_with(|| {
4465                    fidl::new_empty!(Task, fidl::encoding::DefaultFuchsiaResourceDialect)
4466                });
4467                fidl::decode!(
4468                    Task,
4469                    fidl::encoding::DefaultFuchsiaResourceDialect,
4470                    val_ref,
4471                    decoder,
4472                    inner_offset,
4473                    inner_depth
4474                )?;
4475                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4476                {
4477                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4478                }
4479                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4480                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4481                }
4482            }
4483
4484            next_offset += envelope_size;
4485            _next_ordinal_to_read += 1;
4486            if next_offset >= end_offset {
4487                return Ok(());
4488            }
4489
4490            // Decode unknown envelopes for gaps in ordinals.
4491            while _next_ordinal_to_read < 2 {
4492                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4493                _next_ordinal_to_read += 1;
4494                next_offset += envelope_size;
4495            }
4496
4497            let next_out_of_line = decoder.next_out_of_line();
4498            let handles_before = decoder.remaining_handles();
4499            if let Some((inlined, num_bytes, num_handles)) =
4500                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4501            {
4502                let member_inline_size =
4503                    <Task as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4504                if inlined != (member_inline_size <= 4) {
4505                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4506                }
4507                let inner_offset;
4508                let mut inner_depth = depth.clone();
4509                if inlined {
4510                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4511                    inner_offset = next_offset;
4512                } else {
4513                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4514                    inner_depth.increment()?;
4515                }
4516                let val_ref = self.parent_task.get_or_insert_with(|| {
4517                    fidl::new_empty!(Task, fidl::encoding::DefaultFuchsiaResourceDialect)
4518                });
4519                fidl::decode!(
4520                    Task,
4521                    fidl::encoding::DefaultFuchsiaResourceDialect,
4522                    val_ref,
4523                    decoder,
4524                    inner_offset,
4525                    inner_depth
4526                )?;
4527                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4528                {
4529                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4530                }
4531                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4532                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4533                }
4534            }
4535
4536            next_offset += envelope_size;
4537
4538            // Decode the remaining unknown envelopes.
4539            while next_offset < end_offset {
4540                _next_ordinal_to_read += 1;
4541                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4542                next_offset += envelope_size;
4543            }
4544
4545            Ok(())
4546        }
4547    }
4548
4549    impl fidl::encoding::ResourceTypeMarker for Task {
4550        type Borrowed<'a> = &'a mut Self;
4551        fn take_or_borrow<'a>(
4552            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
4553        ) -> Self::Borrowed<'a> {
4554            value
4555        }
4556    }
4557
4558    unsafe impl fidl::encoding::TypeMarker for Task {
4559        type Owned = Self;
4560
4561        #[inline(always)]
4562        fn inline_align(_context: fidl::encoding::Context) -> usize {
4563            8
4564        }
4565
4566        #[inline(always)]
4567        fn inline_size(_context: fidl::encoding::Context) -> usize {
4568            16
4569        }
4570    }
4571
4572    unsafe impl fidl::encoding::Encode<Task, fidl::encoding::DefaultFuchsiaResourceDialect>
4573        for &mut Task
4574    {
4575        #[inline]
4576        unsafe fn encode(
4577            self,
4578            encoder: &mut fidl::encoding::Encoder<
4579                '_,
4580                fidl::encoding::DefaultFuchsiaResourceDialect,
4581            >,
4582            offset: usize,
4583            _depth: fidl::encoding::Depth,
4584        ) -> fidl::Result<()> {
4585            encoder.debug_check_bounds::<Task>(offset);
4586            encoder.write_num::<u64>(self.ordinal(), offset);
4587            match self {
4588                Task::Job(ref mut val) => fidl::encoding::encode_in_envelope::<
4589                    fidl::encoding::HandleType<
4590                        fidl::Job,
4591                        { fidl::ObjectType::JOB.into_raw() },
4592                        2147483648,
4593                    >,
4594                    fidl::encoding::DefaultFuchsiaResourceDialect,
4595                >(
4596                    <fidl::encoding::HandleType<
4597                        fidl::Job,
4598                        { fidl::ObjectType::JOB.into_raw() },
4599                        2147483648,
4600                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
4601                        val
4602                    ),
4603                    encoder,
4604                    offset + 8,
4605                    _depth,
4606                ),
4607                Task::Process(ref mut val) => fidl::encoding::encode_in_envelope::<
4608                    fidl::encoding::HandleType<
4609                        fidl::Process,
4610                        { fidl::ObjectType::PROCESS.into_raw() },
4611                        2147483648,
4612                    >,
4613                    fidl::encoding::DefaultFuchsiaResourceDialect,
4614                >(
4615                    <fidl::encoding::HandleType<
4616                        fidl::Process,
4617                        { fidl::ObjectType::PROCESS.into_raw() },
4618                        2147483648,
4619                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
4620                        val
4621                    ),
4622                    encoder,
4623                    offset + 8,
4624                    _depth,
4625                ),
4626                Task::Thread(ref mut val) => fidl::encoding::encode_in_envelope::<
4627                    fidl::encoding::HandleType<
4628                        fidl::Thread,
4629                        { fidl::ObjectType::THREAD.into_raw() },
4630                        2147483648,
4631                    >,
4632                    fidl::encoding::DefaultFuchsiaResourceDialect,
4633                >(
4634                    <fidl::encoding::HandleType<
4635                        fidl::Thread,
4636                        { fidl::ObjectType::THREAD.into_raw() },
4637                        2147483648,
4638                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
4639                        val
4640                    ),
4641                    encoder,
4642                    offset + 8,
4643                    _depth,
4644                ),
4645                Task::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
4646            }
4647        }
4648    }
4649
4650    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Task {
4651        #[inline(always)]
4652        fn new_empty() -> Self {
4653            Self::__SourceBreaking { unknown_ordinal: 0 }
4654        }
4655
4656        #[inline]
4657        unsafe fn decode(
4658            &mut self,
4659            decoder: &mut fidl::encoding::Decoder<
4660                '_,
4661                fidl::encoding::DefaultFuchsiaResourceDialect,
4662            >,
4663            offset: usize,
4664            mut depth: fidl::encoding::Depth,
4665        ) -> fidl::Result<()> {
4666            decoder.debug_check_bounds::<Self>(offset);
4667            #[allow(unused_variables)]
4668            let next_out_of_line = decoder.next_out_of_line();
4669            let handles_before = decoder.remaining_handles();
4670            let (ordinal, inlined, num_bytes, num_handles) =
4671                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
4672
4673            let member_inline_size = match ordinal {
4674                1 => <fidl::encoding::HandleType<
4675                    fidl::Job,
4676                    { fidl::ObjectType::JOB.into_raw() },
4677                    2147483648,
4678                > as fidl::encoding::TypeMarker>::inline_size(decoder.context),
4679                2 => <fidl::encoding::HandleType<
4680                    fidl::Process,
4681                    { fidl::ObjectType::PROCESS.into_raw() },
4682                    2147483648,
4683                > as fidl::encoding::TypeMarker>::inline_size(decoder.context),
4684                3 => <fidl::encoding::HandleType<
4685                    fidl::Thread,
4686                    { fidl::ObjectType::THREAD.into_raw() },
4687                    2147483648,
4688                > as fidl::encoding::TypeMarker>::inline_size(decoder.context),
4689                0 => return Err(fidl::Error::UnknownUnionTag),
4690                _ => num_bytes as usize,
4691            };
4692
4693            if inlined != (member_inline_size <= 4) {
4694                return Err(fidl::Error::InvalidInlineBitInEnvelope);
4695            }
4696            let _inner_offset;
4697            if inlined {
4698                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
4699                _inner_offset = offset + 8;
4700            } else {
4701                depth.increment()?;
4702                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4703            }
4704            match ordinal {
4705                1 => {
4706                    #[allow(irrefutable_let_patterns)]
4707                    if let Task::Job(_) = self {
4708                        // Do nothing, read the value into the object
4709                    } else {
4710                        // Initialize `self` to the right variant
4711                        *self = Task::Job(
4712                            fidl::new_empty!(fidl::encoding::HandleType<fidl::Job, { fidl::ObjectType::JOB.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
4713                        );
4714                    }
4715                    #[allow(irrefutable_let_patterns)]
4716                    if let Task::Job(ref mut val) = self {
4717                        fidl::decode!(fidl::encoding::HandleType<fidl::Job, { fidl::ObjectType::JOB.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val, decoder, _inner_offset, depth)?;
4718                    } else {
4719                        unreachable!()
4720                    }
4721                }
4722                2 => {
4723                    #[allow(irrefutable_let_patterns)]
4724                    if let Task::Process(_) = self {
4725                        // Do nothing, read the value into the object
4726                    } else {
4727                        // Initialize `self` to the right variant
4728                        *self = Task::Process(
4729                            fidl::new_empty!(fidl::encoding::HandleType<fidl::Process, { fidl::ObjectType::PROCESS.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
4730                        );
4731                    }
4732                    #[allow(irrefutable_let_patterns)]
4733                    if let Task::Process(ref mut val) = self {
4734                        fidl::decode!(fidl::encoding::HandleType<fidl::Process, { fidl::ObjectType::PROCESS.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val, decoder, _inner_offset, depth)?;
4735                    } else {
4736                        unreachable!()
4737                    }
4738                }
4739                3 => {
4740                    #[allow(irrefutable_let_patterns)]
4741                    if let Task::Thread(_) = self {
4742                        // Do nothing, read the value into the object
4743                    } else {
4744                        // Initialize `self` to the right variant
4745                        *self = Task::Thread(
4746                            fidl::new_empty!(fidl::encoding::HandleType<fidl::Thread, { fidl::ObjectType::THREAD.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
4747                        );
4748                    }
4749                    #[allow(irrefutable_let_patterns)]
4750                    if let Task::Thread(ref mut val) = self {
4751                        fidl::decode!(fidl::encoding::HandleType<fidl::Thread, { fidl::ObjectType::THREAD.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val, decoder, _inner_offset, depth)?;
4752                    } else {
4753                        unreachable!()
4754                    }
4755                }
4756                #[allow(deprecated)]
4757                ordinal => {
4758                    for _ in 0..num_handles {
4759                        decoder.drop_next_handle()?;
4760                    }
4761                    *self = Task::__SourceBreaking { unknown_ordinal: ordinal };
4762                }
4763            }
4764            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
4765                return Err(fidl::Error::InvalidNumBytesInEnvelope);
4766            }
4767            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4768                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4769            }
4770            Ok(())
4771        }
4772    }
4773}