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