// WARNING: This file is machine generated by fidlgen.

#![allow(
	deprecated, // FIDL Impl struct pattern is referenced internally
	unused_parens, // one-element-tuple-case is not a tuple
	unused_mut, // not all args require mutation, but many do
	nonstandard_style, // auto-caps does its best, but is not always successful
)]
#![recursion_limit = "512"]

#[cfg(target_os = "fuchsia")]
#[allow(unused_imports)]
use fuchsia_zircon as zx;

#[allow(unused_imports)]
use {
    bitflags::bitflags,
    fidl::{
        client::{decode_transaction_body_fut, QueryResponseFut},
        fidl_empty_struct, fidl_flexible_bits, fidl_flexible_enum, fidl_strict_bits,
        fidl_strict_enum, fidl_struct, fidl_struct_copy, fidl_table, fidl_xunion,
        wrap_handle_metadata,
    },
    fuchsia_zircon_status as zx_status,
    futures::future::{self, MaybeDone, TryFutureExt},
};

const _FIDL_TRACE_BINDINGS_RUST: u32 = 6;

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum PizzaOrPasta {
    Pizza(Pizza),
    Pasta(Pasta),
}
fidl_xunion! {
    name: PizzaOrPasta,
    members: [
        Pizza {
            ty: Pizza,
            ordinal: 1,
        },
        Pasta {
            ty: Pasta,
            ordinal: 2,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ExplicitPizzaOrPasta {
    Pizza(Pizza),
    Pasta(Pasta),
}
fidl_xunion! {
    name: ExplicitPizzaOrPasta,
    members: [
        Pizza {
            ty: Pizza,
            ordinal: 1,
        },
        Pasta {
            ty: Pasta,
            ordinal: 4,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, PartialEq)]
pub enum FlexiblePizzaOrPasta {
    Pizza(Pizza),
    Pasta(Pasta),
    #[deprecated = "Use `FlexiblePizzaOrPasta::unknown()` to construct and `FlexiblePizzaOrPastaUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown FlexiblePizzaOrPasta member.
#[macro_export]
macro_rules! FlexiblePizzaOrPastaUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: FlexiblePizzaOrPasta,
    members: [
        Pizza {
            ty: Pizza,
            ordinal: 1,
        },
        Pasta {
            ty: Pasta,
            ordinal: 2,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum StrictPizzaOrPasta {
    Pizza(Pizza),
    Pasta(Pasta),
}
fidl_xunion! {
    name: StrictPizzaOrPasta,
    members: [
        Pizza {
            ty: Pizza,
            ordinal: 1,
        },
        Pasta {
            ty: Pasta,
            ordinal: 2,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum Union {
    Primitive(i32),
    StringNeedsConstructor(String),
    VectorStringAlsoNeedsConstructor(Vec<String>),
}
fidl_xunion! {
    name: Union,
    members: [
        Primitive {
            ty: i32,
            ordinal: 1,
        },
        StringNeedsConstructor {
            ty: String,
            ordinal: 2,
        },
        VectorStringAlsoNeedsConstructor {
            ty: Vec<String>,
            ordinal: 3,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, PartialEq)]
pub enum FlexibleUnion {
    Primitive(i32),
    StringNeedsConstructor(String),
    VectorStringAlsoNeedsConstructor(Vec<String>),
    #[deprecated = "Use `FlexibleUnion::unknown()` to construct and `FlexibleUnionUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown FlexibleUnion member.
#[macro_export]
macro_rules! FlexibleUnionUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: FlexibleUnion,
    members: [
        Primitive {
            ty: i32,
            ordinal: 1,
        },
        StringNeedsConstructor {
            ty: String,
            ordinal: 2,
        },
        VectorStringAlsoNeedsConstructor {
            ty: Vec<String>,
            ordinal: 3,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum StrictUnion {
    Primitive(i32),
    StringNeedsConstructor(String),
    VectorStringAlsoNeedsConstructor(Vec<String>),
}
fidl_xunion! {
    name: StrictUnion,
    members: [
        Primitive {
            ty: i32,
            ordinal: 1,
        },
        StringNeedsConstructor {
            ty: String,
            ordinal: 2,
        },
        VectorStringAlsoNeedsConstructor {
            ty: Vec<String>,
            ordinal: 3,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum FieldCollision {
    FieldCollisionTag(i32),
}
fidl_xunion! {
    name: FieldCollision,
    members: [
        FieldCollisionTag {
            ty: i32,
            ordinal: 1,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ExplicitUnion {
    Primitive(i32),
    StringNeedsConstructor(String),
}
fidl_xunion! {
    name: ExplicitUnion,
    members: [
        Primitive {
            ty: i32,
            ordinal: 1,
        },
        StringNeedsConstructor {
            ty: String,
            ordinal: 3,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ReverseOrdinalUnion {
    Second(u32),
    First(u32),
}
fidl_xunion! {
    name: ReverseOrdinalUnion,
    members: [
        Second {
            ty: u32,
            ordinal: 2,
        },
        First {
            ty: u32,
            ordinal: 1,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, PartialEq)]
pub enum FlexibleFoo {
    S(String),
    I(i32),
    #[deprecated = "Use `FlexibleFoo::unknown()` to construct and `FlexibleFooUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown FlexibleFoo member.
#[macro_export]
macro_rules! FlexibleFooUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: FlexibleFoo,
    members: [
        S {
            ty: String,
            ordinal: 1,
        },
        I {
            ty: i32,
            ordinal: 2,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum StrictFoo {
    S(String),
    I(i32),
}
fidl_xunion! {
    name: StrictFoo,
    members: [
        S {
            ty: String,
            ordinal: 1,
        },
        I {
            ty: i32,
            ordinal: 2,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, PartialEq)]
pub enum ExplicitFoo {
    S(String),
    I(i32),
    #[deprecated = "Use `ExplicitFoo::unknown()` to construct and `ExplicitFooUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown ExplicitFoo member.
#[macro_export]
macro_rules! ExplicitFooUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: ExplicitFoo,
    members: [
        S {
            ty: String,
            ordinal: 2,
        },
        I {
            ty: i32,
            ordinal: 1,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ExplicitStrictFoo {
    S(String),
    I(i32),
}
fidl_xunion! {
    name: ExplicitStrictFoo,
    members: [
        S {
            ty: String,
            ordinal: 3,
        },
        I {
            ty: i32,
            ordinal: 2,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, PartialEq)]
pub enum OlderSimpleUnion {
    I(i64),
    F(f32),
    #[deprecated = "Use `OlderSimpleUnion::unknown()` to construct and `OlderSimpleUnionUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown OlderSimpleUnion member.
#[macro_export]
macro_rules! OlderSimpleUnionUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: OlderSimpleUnion,
    members: [
        I {
            ty: i64,
            ordinal: 1,
        },
        F {
            ty: f32,
            ordinal: 2,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, PartialEq)]
pub enum NewerSimpleUnion {
    I(i64),
    S(String),
    V(Vec<String>),
    #[deprecated = "Use `NewerSimpleUnion::unknown()` to construct and `NewerSimpleUnionUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown NewerSimpleUnion member.
#[macro_export]
macro_rules! NewerSimpleUnionUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: NewerSimpleUnion,
    members: [
        I {
            ty: i64,
            ordinal: 1,
        },
        S {
            ty: String,
            ordinal: 2,
        },
        V {
            ty: Vec<String>,
            ordinal: 3,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub enum StrictSimpleXUnion {
    I(i32),
    F(f32),
    S(String),
}
fidl_xunion! {
    name: StrictSimpleXUnion,
    members: [
        I {
            ty: i32,
            ordinal: 1,
        },
        F {
            ty: f32,
            ordinal: 2,
        },
        S {
            ty: String,
            ordinal: 3,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, PartialEq)]
pub enum XUnionContainingEmptyStruct {
    Empty(Empty),
    #[deprecated = "Use `XUnionContainingEmptyStruct::unknown()` to construct and `XUnionContainingEmptyStructUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown XUnionContainingEmptyStruct member.
#[macro_export]
macro_rules! XUnionContainingEmptyStructUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: XUnionContainingEmptyStruct,
    members: [
        Empty {
            ty: Empty,
            ordinal: 1,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum StrictBoundedXUnion {
    V(Vec<u8>),
}
fidl_xunion! {
    name: StrictBoundedXUnion,
    members: [
        V {
            ty: Vec<u8>,
            ordinal: 1,
        },
    ],
    strict_value: true,
}

#[derive(Debug, Clone, PartialEq)]
pub enum ExplicitXUnion {
    I(i64),
    F(f32),
    #[deprecated = "Use `ExplicitXUnion::unknown()` to construct and `ExplicitXUnionUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown ExplicitXUnion member.
#[macro_export]
macro_rules! ExplicitXUnionUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: ExplicitXUnion,
    members: [
        I {
            ty: i64,
            ordinal: 1,
        },
        F {
            ty: f32,
            ordinal: 4,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct Pizza {
    pub toppings: Vec<String>,
}

fidl_struct! {
  name: Pizza,
  members: [
    toppings {
      ty: Vec<String>,
      offset_v1: 0,
    },
  ],
  padding: [],
  size_v1: 16,
  align_v1: 8,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct Pasta {
    pub sauce: String,
}

fidl_struct! {
  name: Pasta,
  members: [
    sauce {
      ty: String,
      offset_v1: 0,
    },
  ],
  padding: [],
  size_v1: 16,
  align_v1: 8,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct NullableUnionStruct {
    pub the_union: Option<Box<Union>>,
}

fidl_struct! {
  name: NullableUnionStruct,
  members: [
    the_union {
      ty: Option<Box<Union>>,
      offset_v1: 0,
    },
  ],
  padding: [],
  size_v1: 24,
  align_v1: 8,
}

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct Empty;

fidl_empty_struct!(Empty);

#[derive(Debug, Clone, PartialEq)]
pub struct StructWithNullableXUnion {
    pub x1: Option<Box<OlderSimpleUnion>>,
}

fidl_struct! {
  name: StructWithNullableXUnion,
  members: [
    x1 {
      ty: Option<Box<OlderSimpleUnion>>,
      offset_v1: 0,
    },
  ],
  padding: [],
  size_v1: 24,
  align_v1: 8,
}

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct TestProtocolMarker;

impl fidl::endpoints::ServiceMarker for TestProtocolMarker {
    type Proxy = TestProtocolProxy;
    type RequestStream = TestProtocolRequestStream;
    const DEBUG_NAME: &'static str = "(anonymous) TestProtocol";
}

pub trait TestProtocolProxyInterface: Send + Sync {
    type StrictXUnionHenceResponseMayBeStackAllocatedResponseFut: std::future::Future<
        Output = Result<(StrictBoundedXUnion), fidl::Error>,
    > + Send;
    fn strict_x_union_hence_response_may_be_stack_allocated(
        &self,
    ) -> Self::StrictXUnionHenceResponseMayBeStackAllocatedResponseFut;
    type FlexibleXUnionHenceResponseMustBeHeapAllocatedResponseFut: std::future::Future<
        Output = Result<(OlderSimpleUnion), fidl::Error>,
    > + Send;
    fn flexible_x_union_hence_response_must_be_heap_allocated(
        &self,
    ) -> Self::FlexibleXUnionHenceResponseMustBeHeapAllocatedResponseFut;
}

#[derive(Debug)]
#[cfg(target_os = "fuchsia")]
pub struct TestProtocolSynchronousProxy {
    client: fidl::client::sync::Client,
}

#[cfg(target_os = "fuchsia")]
impl TestProtocolSynchronousProxy {
    pub fn new(channel: fidl::Channel) -> Self {
        Self { client: fidl::client::sync::Client::new(channel) }
    }

    pub fn into_channel(self) -> fidl::Channel {
        self.client.into_channel()
    }
    pub fn strict_x_union_hence_response_may_be_stack_allocated(
        &mut self,
        ___deadline: zx::Time,
    ) -> Result<(StrictBoundedXUnion), fidl::Error> {
        let _value: (StrictBoundedXUnion,) =
            self.client.send_query(&mut (), 0x747b084a44f0dc3e, ___deadline)?;
        Ok(_value.0)
    }
    pub fn flexible_x_union_hence_response_must_be_heap_allocated(
        &mut self,
        ___deadline: zx::Time,
    ) -> Result<(OlderSimpleUnion), fidl::Error> {
        let _value: (OlderSimpleUnion,) =
            self.client.send_query(&mut (), 0x57615a25c2a785d2, ___deadline)?;
        Ok(_value.0)
    }
}

#[derive(Debug, Clone)]
pub struct TestProtocolProxy {
    client: fidl::client::Client,
}

impl fidl::endpoints::Proxy for TestProtocolProxy {
    type Service = TestProtocolMarker;

    fn from_channel(inner: fidl::AsyncChannel) -> Self {
        Self::new(inner)
    }

    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
        self.client.into_channel().map_err(|client| Self { client })
    }

    fn as_channel(&self) -> &::fidl::AsyncChannel {
        self.client.as_channel()
    }
}

impl TestProtocolProxy {
    /// Create a new Proxy for TestProtocol
    pub fn new(channel: fidl::AsyncChannel) -> Self {
        let service_name = <TestProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME;
        Self { client: fidl::client::Client::new(channel, service_name) }
    }

    /// Get a Stream of events from the remote end of the TestProtocol protocol
    ///
    /// # Panics
    ///
    /// Panics if the event stream was already taken.
    pub fn take_event_stream(&self) -> TestProtocolEventStream {
        TestProtocolEventStream { event_receiver: self.client.take_event_receiver() }
    }
    pub fn strict_x_union_hence_response_may_be_stack_allocated(
        &self,
    ) -> fidl::client::QueryResponseFut<(StrictBoundedXUnion)> {
        TestProtocolProxyInterface::strict_x_union_hence_response_may_be_stack_allocated(self)
    }
    pub fn flexible_x_union_hence_response_must_be_heap_allocated(
        &self,
    ) -> fidl::client::QueryResponseFut<(OlderSimpleUnion)> {
        TestProtocolProxyInterface::flexible_x_union_hence_response_must_be_heap_allocated(self)
    }
}

impl TestProtocolProxyInterface for TestProtocolProxy {
    type StrictXUnionHenceResponseMayBeStackAllocatedResponseFut =
        fidl::client::QueryResponseFut<(StrictBoundedXUnion)>;
    fn strict_x_union_hence_response_may_be_stack_allocated(
        &self,
    ) -> Self::StrictXUnionHenceResponseMayBeStackAllocatedResponseFut {
        fn transform(
            result: Result<(StrictBoundedXUnion,), fidl::Error>,
        ) -> Result<(StrictBoundedXUnion), fidl::Error> {
            result.map(|_value| _value.0)
        }
        let send_result = self.client.call_send_raw_query(&mut (), 0x747b084a44f0dc3e);
        QueryResponseFut(match send_result {
            Ok(res_fut) => future::maybe_done(
                res_fut.and_then(|buf| decode_transaction_body_fut(buf, transform)),
            ),
            Err(e) => MaybeDone::Done(Err(e)),
        })
    }
    type FlexibleXUnionHenceResponseMustBeHeapAllocatedResponseFut =
        fidl::client::QueryResponseFut<(OlderSimpleUnion)>;
    fn flexible_x_union_hence_response_must_be_heap_allocated(
        &self,
    ) -> Self::FlexibleXUnionHenceResponseMustBeHeapAllocatedResponseFut {
        fn transform(
            result: Result<(OlderSimpleUnion,), fidl::Error>,
        ) -> Result<(OlderSimpleUnion), fidl::Error> {
            result.map(|_value| _value.0)
        }
        let send_result = self.client.call_send_raw_query(&mut (), 0x57615a25c2a785d2);
        QueryResponseFut(match send_result {
            Ok(res_fut) => future::maybe_done(
                res_fut.and_then(|buf| decode_transaction_body_fut(buf, transform)),
            ),
            Err(e) => MaybeDone::Done(Err(e)),
        })
    }
}

pub struct TestProtocolEventStream {
    event_receiver: fidl::client::EventReceiver,
}

impl std::marker::Unpin for TestProtocolEventStream {}

impl futures::stream::FusedStream for TestProtocolEventStream {
    fn is_terminated(&self) -> bool {
        self.event_receiver.is_terminated()
    }
}

impl futures::Stream for TestProtocolEventStream {
    type Item = Result<TestProtocolEvent, fidl::Error>;

    fn poll_next(
        mut self: std::pin::Pin<&mut Self>,
        cx: &mut std::task::Context<'_>,
    ) -> std::task::Poll<Option<Self::Item>> {
        let mut buf = match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
            &mut self.event_receiver,
            cx
        )?) {
            Some(buf) => buf,
            None => return std::task::Poll::Ready(None),
        };
        let (bytes, _handles) = buf.split_mut();
        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;

        std::task::Poll::Ready(Some(match tx_header.ordinal() {
            _ => Err(fidl::Error::UnknownOrdinal {
                ordinal: tx_header.ordinal(),
                service_name: <TestProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME,
            }),
        }))
    }
}

#[derive(Debug)]
pub enum TestProtocolEvent {}

impl TestProtocolEvent {}

/// A type which can be used to send responses and events into a borrowed channel.
///
/// Note: this should only be used when the channel must be temporarily
/// borrowed. For a typical sending of events, use the send_ methods
/// on the ControlHandle types, which can be acquired through a
/// RequestStream or Responder type.
#[deprecated(note = "Use TestProtocolRequestStream / Responder instead")]
pub struct TestProtocolServerSender<'a> {
    // Some protocols don't define events which would render this channel unused.
    #[allow(unused)]
    channel: &'a fidl::Channel,
}

impl<'a> TestProtocolServerSender<'a> {
    pub fn new(channel: &'a fidl::Channel) -> Self {
        Self { channel }
    }
    pub fn send_strict_x_union_hence_response_may_be_stack_allocated_response(
        &self,
        txid: fidl::client::Txid,
        mut xu: &mut StrictBoundedXUnion,
    ) -> Result<(), fidl::Error> {
        fidl::encoding::with_tls_encode_buf(|bytes_, handles_| {
            TestProtocolEncoder::encode_strict_x_union_hence_response_may_be_stack_allocated_response(
				bytes_, handles_,
				txid.as_raw_id(),xu,)?;
            self.channel
                .write_etc(&*bytes_, &mut *handles_)
                .map_err(fidl::Error::ServerResponseWrite)?;
            Ok(())
        })
    }
    pub fn send_flexible_x_union_hence_response_must_be_heap_allocated_response(
        &self,
        txid: fidl::client::Txid,
        mut xu: &mut OlderSimpleUnion,
    ) -> Result<(), fidl::Error> {
        fidl::encoding::with_tls_encode_buf(|bytes_, handles_| {
            TestProtocolEncoder::encode_flexible_x_union_hence_response_must_be_heap_allocated_response(
				bytes_, handles_,
				txid.as_raw_id(),xu,)?;
            self.channel
                .write_etc(&*bytes_, &mut *handles_)
                .map_err(fidl::Error::ServerResponseWrite)?;
            Ok(())
        })
    }
}

/// A Stream of incoming requests for TestProtocol
pub struct TestProtocolRequestStream {
    inner: std::sync::Arc<fidl::ServeInner>,
    is_terminated: bool,
}

impl std::marker::Unpin for TestProtocolRequestStream {}

impl futures::stream::FusedStream for TestProtocolRequestStream {
    fn is_terminated(&self) -> bool {
        self.is_terminated
    }
}

impl fidl::endpoints::RequestStream for TestProtocolRequestStream {
    type Service = TestProtocolMarker;

    /// Consume a channel to make a TestProtocolRequestStream
    fn from_channel(channel: fidl::AsyncChannel) -> Self {
        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
    }

    /// ControlHandle for the remote connection
    type ControlHandle = TestProtocolControlHandle;

    /// ControlHandle for the remote connection
    fn control_handle(&self) -> Self::ControlHandle {
        TestProtocolControlHandle { inner: self.inner.clone() }
    }

    fn into_inner(self) -> (::std::sync::Arc<fidl::ServeInner>, bool) {
        (self.inner, self.is_terminated)
    }

    fn from_inner(inner: std::sync::Arc<fidl::ServeInner>, is_terminated: bool) -> Self {
        Self { inner, is_terminated }
    }
}

impl futures::Stream for TestProtocolRequestStream {
    type Item = Result<TestProtocolRequest, fidl::Error>;

    fn poll_next(
        mut self: std::pin::Pin<&mut Self>,
        cx: &mut std::task::Context<'_>,
    ) -> std::task::Poll<Option<Self::Item>> {
        let this = &mut *self;
        if this.inner.poll_shutdown(cx) {
            this.is_terminated = true;
            return std::task::Poll::Ready(None);
        }
        if this.is_terminated {
            panic!("polled TestProtocolRequestStream after completion");
        }
        fidl::encoding::with_tls_decode_buf(|bytes, handles| {
            match this.inner.channel().read_etc(cx, bytes, handles) {
                std::task::Poll::Ready(Ok(())) => {}
                std::task::Poll::Pending => return std::task::Poll::Pending,
                std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
                    this.is_terminated = true;
                    return std::task::Poll::Ready(None);
                }
                std::task::Poll::Ready(Err(e)) => {
                    return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(e))))
                }
            }

            // A message has been received from the channel
            let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
            if !header.is_compatible() {
                return std::task::Poll::Ready(Some(Err(fidl::Error::IncompatibleMagicNumber(
                    header.magic_number(),
                ))));
            }

            std::task::Poll::Ready(Some(match header.ordinal() {
                0x747b084a44f0dc3e => {
                    let mut req: () = fidl::encoding::Decodable::new_empty();
                    fidl::duration_begin!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedRequest");
                    fidl::trace_blob!("fidl:blob", "decode", bytes);
                    fidl::encoding::Decoder::decode_into(&header, _body_bytes, handles, &mut req)?;
                    fidl::duration_end!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => bytes.len() as u32, "handle_count" => handles.len() as u32);
                    let control_handle = TestProtocolControlHandle { inner: this.inner.clone() };

                    Ok(TestProtocolRequest::StrictXUnionHenceResponseMayBeStackAllocated {
                        responder:
                            TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponder {
                                control_handle: std::mem::ManuallyDrop::new(control_handle),
                                tx_id: header.tx_id(),
                                ordinal: header.ordinal(),
                            },
                    })
                }
                0x57615a25c2a785d2 => {
                    let mut req: () = fidl::encoding::Decodable::new_empty();
                    fidl::duration_begin!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedRequest");
                    fidl::trace_blob!("fidl:blob", "decode", bytes);
                    fidl::encoding::Decoder::decode_into(&header, _body_bytes, handles, &mut req)?;
                    fidl::duration_end!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => bytes.len() as u32, "handle_count" => handles.len() as u32);
                    let control_handle = TestProtocolControlHandle { inner: this.inner.clone() };

                    Ok(TestProtocolRequest::FlexibleXUnionHenceResponseMustBeHeapAllocated {
                        responder:
                            TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponder {
                                control_handle: std::mem::ManuallyDrop::new(control_handle),
                                tx_id: header.tx_id(),
                                ordinal: header.ordinal(),
                            },
                    })
                }
                _ => Err(fidl::Error::UnknownOrdinal {
                    ordinal: header.ordinal(),
                    service_name:
                        <TestProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME,
                }),
            }))
        })
    }
}

/// Represents a single request.
/// RequestMessages should only be used for manual deserialization when higher level
/// structs such as RequestStream cannot be used. One usually would only encounter
/// such scenarios when working with legacy FIDL code (prior to FIDL generated client/server bindings).
#[derive(Debug)]
#[deprecated(note = "Use TestProtocolRequest instead")]
pub enum TestProtocolRequestMessage {
    StrictXUnionHenceResponseMayBeStackAllocated { tx_id: fidl::client::Txid },
    FlexibleXUnionHenceResponseMustBeHeapAllocated { tx_id: fidl::client::Txid },
}

impl TestProtocolRequestMessage {
    pub fn decode(
        bytes: &[u8],
        _handles: &mut [fidl::HandleInfo],
    ) -> Result<TestProtocolRequestMessage, fidl::Error> {
        let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;

        match header.ordinal() {
            0x747b084a44f0dc3e => {
                let mut out_tuple: () = fidl::encoding::Decodable::new_empty();
                fidl::duration_begin!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedRequest");
                fidl::trace_blob!("fidl:blob", "decode", bytes);
                fidl::encoding::Decoder::decode_into(
                    &header,
                    _body_bytes,
                    _handles,
                    &mut out_tuple,
                )?;
                fidl::duration_end!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => bytes.len() as u32, "handle_count" => _handles.len() as u32);

                Ok(TestProtocolRequestMessage::StrictXUnionHenceResponseMayBeStackAllocated {
                    tx_id: header.tx_id().into(),
                })
            }
            0x57615a25c2a785d2 => {
                let mut out_tuple: () = fidl::encoding::Decodable::new_empty();
                fidl::duration_begin!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedRequest");
                fidl::trace_blob!("fidl:blob", "decode", bytes);
                fidl::encoding::Decoder::decode_into(
                    &header,
                    _body_bytes,
                    _handles,
                    &mut out_tuple,
                )?;
                fidl::duration_end!("fidl", "decode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => bytes.len() as u32, "handle_count" => _handles.len() as u32);

                Ok(TestProtocolRequestMessage::FlexibleXUnionHenceResponseMustBeHeapAllocated {
                    tx_id: header.tx_id().into(),
                })
            }
            _ => Err(fidl::Error::UnknownOrdinal {
                ordinal: header.ordinal(),
                service_name: <TestProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME,
            }),
        }
    }
}
#[derive(Debug)]
pub enum TestProtocolRequest {
    StrictXUnionHenceResponseMayBeStackAllocated {
        responder: TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponder,
    },
    FlexibleXUnionHenceResponseMustBeHeapAllocated {
        responder: TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponder,
    },
}

impl TestProtocolRequest {
    #[allow(irrefutable_let_patterns)]
    pub fn into_strict_x_union_hence_response_may_be_stack_allocated(
        self,
    ) -> Option<(TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponder)> {
        if let TestProtocolRequest::StrictXUnionHenceResponseMayBeStackAllocated { responder } =
            self
        {
            Some((responder))
        } else {
            None
        }
    }

    #[allow(irrefutable_let_patterns)]
    pub fn into_flexible_x_union_hence_response_must_be_heap_allocated(
        self,
    ) -> Option<(TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponder)> {
        if let TestProtocolRequest::FlexibleXUnionHenceResponseMustBeHeapAllocated { responder } =
            self
        {
            Some((responder))
        } else {
            None
        }
    }

    /// Name of the method defined in FIDL
    pub fn method_name(&self) -> &'static str {
        match *self {
            TestProtocolRequest::StrictXUnionHenceResponseMayBeStackAllocated { .. } => {
                "strict_x_union_hence_response_may_be_stack_allocated"
            }
            TestProtocolRequest::FlexibleXUnionHenceResponseMustBeHeapAllocated { .. } => {
                "flexible_x_union_hence_response_must_be_heap_allocated"
            }
        }
    }
}

pub struct TestProtocolEncoder;

impl TestProtocolEncoder {
    pub fn encode_strict_x_union_hence_response_may_be_stack_allocated_request<'a>(
        out_bytes: &'a mut Vec<u8>,
        out_handles: &'a mut Vec<fidl::HandleDisposition<'static>>,
        tx_id: u32,
    ) -> Result<(), fidl::Error> {
        let header = fidl::encoding::TransactionHeader::new(tx_id, 0x747b084a44f0dc3e);
        let mut body = ();
        let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };
        fidl::duration_begin!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedRequest");
        fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
        fidl::trace_blob!("fidl:blob", "encode", out_bytes.as_slice());
        fidl::duration_end!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => out_bytes.len() as u32, "handle_count" => out_handles.len() as u32);
        Ok(())
    }
    pub fn encode_strict_x_union_hence_response_may_be_stack_allocated_response<'a>(
        out_bytes: &'a mut Vec<u8>,
        out_handles: &'a mut Vec<fidl::HandleDisposition<'static>>,
        tx_id: u32,
        mut in_xu: &mut StrictBoundedXUnion,
    ) -> Result<(), fidl::Error> {
        let header = fidl::encoding::TransactionHeader::new(tx_id, 0x747b084a44f0dc3e);
        let mut body = (in_xu,);
        let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };

        fidl::duration_begin!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponse");
        fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
        fidl::trace_blob!("fidl:blob", "encode", out_bytes.as_slice());
        fidl::duration_end!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => out_bytes.len() as u32, "handle_count" => out_handles.len() as u32);

        Ok(())
    }
    pub fn encode_flexible_x_union_hence_response_must_be_heap_allocated_request<'a>(
        out_bytes: &'a mut Vec<u8>,
        out_handles: &'a mut Vec<fidl::HandleDisposition<'static>>,
        tx_id: u32,
    ) -> Result<(), fidl::Error> {
        let header = fidl::encoding::TransactionHeader::new(tx_id, 0x57615a25c2a785d2);
        let mut body = ();
        let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };
        fidl::duration_begin!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedRequest");
        fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
        fidl::trace_blob!("fidl:blob", "encode", out_bytes.as_slice());
        fidl::duration_end!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => out_bytes.len() as u32, "handle_count" => out_handles.len() as u32);
        Ok(())
    }
    pub fn encode_flexible_x_union_hence_response_must_be_heap_allocated_response<'a>(
        out_bytes: &'a mut Vec<u8>,
        out_handles: &'a mut Vec<fidl::HandleDisposition<'static>>,
        tx_id: u32,
        mut in_xu: &mut OlderSimpleUnion,
    ) -> Result<(), fidl::Error> {
        let header = fidl::encoding::TransactionHeader::new(tx_id, 0x57615a25c2a785d2);
        let mut body = (in_xu,);
        let mut msg = fidl::encoding::TransactionMessage { header, body: &mut body };

        fidl::duration_begin!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse");
        fidl::encoding::Encoder::encode(out_bytes, out_handles, &mut msg)?;
        fidl::trace_blob!("fidl:blob", "encode", out_bytes.as_slice());
        fidl::duration_end!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => out_bytes.len() as u32, "handle_count" => out_handles.len() as u32);

        Ok(())
    }
}

#[derive(Debug, Clone)]
pub struct TestProtocolControlHandle {
    inner: std::sync::Arc<fidl::ServeInner>,
}

impl TestProtocolControlHandle {
    /// Set the server to shutdown. The underlying channel is only closed the
    /// next time the stream is polled.
    pub fn shutdown(&self) {
        self.inner.shutdown()
    }

    pub fn shutdown_with_epitaph(&self, status: zx_status::Status) {
        self.inner.shutdown_with_epitaph(status)
    }
}
#[must_use = "FIDL methods require a response to be sent"]
#[derive(Debug)]
pub struct TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponder {
    control_handle: std::mem::ManuallyDrop<TestProtocolControlHandle>,
    tx_id: u32,
    ordinal: u64,
}

/// Set the the channel to be shutdown (see [`TestProtocolControlHandle::shutdown`])
/// if the responder is dropped without sending a response, so that the client
/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
impl std::ops::Drop for TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponder {
    fn drop(&mut self) {
        self.control_handle.shutdown();
        // Safety: drops once, never accessed again
        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
    }
}

impl TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponder {
    pub fn control_handle(&self) -> &TestProtocolControlHandle {
        &self.control_handle
    }

    /// Drop the Responder without setting the channel to shutdown.
    ///
    /// This method shouldn't normally be used-- instead, send a response
    /// to prevent the channel from shutting down.
    pub fn drop_without_shutdown(mut self) {
        // Safety: drops once, never accessed again due to mem::forget
        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
        // Prevent Drop from running (which would shut down the channel)
        std::mem::forget(self);
    }

    /// Sends a response to the FIDL transaction.
    ///
    /// Sets the channel to shutdown if an error occurs.
    pub fn send(self, mut xu: &mut StrictBoundedXUnion) -> Result<(), fidl::Error> {
        let r = self.send_raw(xu);
        if r.is_err() {
            self.control_handle.shutdown();
        }
        self.drop_without_shutdown();
        r
    }

    /// Similar to "send" but does not shutdown the channel if
    /// an error occurs.
    pub fn send_no_shutdown_on_err(
        self,
        mut xu: &mut StrictBoundedXUnion,
    ) -> Result<(), fidl::Error> {
        let r = self.send_raw(xu);
        self.drop_without_shutdown();
        r
    }

    fn send_raw(&self, mut xu: &mut StrictBoundedXUnion) -> Result<(), fidl::Error> {
        let mut response = (xu);

        let mut msg = fidl::encoding::TransactionMessage {
            header: fidl::encoding::TransactionHeader::new(self.tx_id, self.ordinal),
            body: &mut response,
        };

        fidl::encoding::with_tls_encode_buf(|bytes, handles| {
            fidl::duration_begin!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedResponse");
            fidl::encoding::Encoder::encode(bytes, handles, &mut msg)?;
            fidl::trace_blob!("fidl:blob", "encode", bytes.as_slice());
            fidl::duration_end!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => bytes.len() as u32, "handle_count" => handles.len() as u32);

            self.control_handle
                .inner
                .channel()
                .write_etc(&*bytes, &mut *handles)
                .map_err(fidl::Error::ServerResponseWrite)?;
            Ok(())
        })
    }
}
#[must_use = "FIDL methods require a response to be sent"]
#[derive(Debug)]
pub struct TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponder {
    control_handle: std::mem::ManuallyDrop<TestProtocolControlHandle>,
    tx_id: u32,
    ordinal: u64,
}

/// Set the the channel to be shutdown (see [`TestProtocolControlHandle::shutdown`])
/// if the responder is dropped without sending a response, so that the client
/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
impl std::ops::Drop for TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponder {
    fn drop(&mut self) {
        self.control_handle.shutdown();
        // Safety: drops once, never accessed again
        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
    }
}

impl TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponder {
    pub fn control_handle(&self) -> &TestProtocolControlHandle {
        &self.control_handle
    }

    /// Drop the Responder without setting the channel to shutdown.
    ///
    /// This method shouldn't normally be used-- instead, send a response
    /// to prevent the channel from shutting down.
    pub fn drop_without_shutdown(mut self) {
        // Safety: drops once, never accessed again due to mem::forget
        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
        // Prevent Drop from running (which would shut down the channel)
        std::mem::forget(self);
    }

    /// Sends a response to the FIDL transaction.
    ///
    /// Sets the channel to shutdown if an error occurs.
    pub fn send(self, mut xu: &mut OlderSimpleUnion) -> Result<(), fidl::Error> {
        let r = self.send_raw(xu);
        if r.is_err() {
            self.control_handle.shutdown();
        }
        self.drop_without_shutdown();
        r
    }

    /// Similar to "send" but does not shutdown the channel if
    /// an error occurs.
    pub fn send_no_shutdown_on_err(self, mut xu: &mut OlderSimpleUnion) -> Result<(), fidl::Error> {
        let r = self.send_raw(xu);
        self.drop_without_shutdown();
        r
    }

    fn send_raw(&self, mut xu: &mut OlderSimpleUnion) -> Result<(), fidl::Error> {
        let mut response = (xu);

        let mut msg = fidl::encoding::TransactionMessage {
            header: fidl::encoding::TransactionHeader::new(self.tx_id, self.ordinal),
            body: &mut response,
        };

        fidl::encoding::with_tls_encode_buf(|bytes, handles| {
            fidl::duration_begin!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "name" => "fidl.test.union/TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse");
            fidl::encoding::Encoder::encode(bytes, handles, &mut msg)?;
            fidl::trace_blob!("fidl:blob", "encode", bytes.as_slice());
            fidl::duration_end!("fidl", "encode", "bindings" => _FIDL_TRACE_BINDINGS_RUST, "size" => bytes.len() as u32, "handle_count" => handles.len() as u32);

            self.control_handle
                .inner
                .channel()
                .write_etc(&*bytes, &mut *handles)
                .map_err(fidl::Error::ServerResponseWrite)?;
            Ok(())
        })
    }
}
