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