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

#![allow(
	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},
        encoding::{Decodable as _, Encodable as _},
        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 r#strict_x_union_hence_response_may_be_stack_allocated(
        &self,
    ) -> Self::StrictXUnionHenceResponseMayBeStackAllocatedResponseFut;
    type FlexibleXUnionHenceResponseMustBeHeapAllocatedResponseFut: std::future::Future<Output = Result<(OlderSimpleUnion), fidl::Error>>
        + Send;
    fn r#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 {
        let service_name = <TestProtocolMarker as fidl::endpoints::ServiceMarker>::DEBUG_NAME;
        Self { client: fidl::client::sync::Client::new(channel, service_name) }
    }

    pub fn into_channel(self) -> fidl::Channel {
        self.client.into_channel()
    }
    pub fn r#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 r#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 r#strict_x_union_hence_response_may_be_stack_allocated(
        &self,
    ) -> fidl::client::QueryResponseFut<(StrictBoundedXUnion)> {
        TestProtocolProxyInterface::r#strict_x_union_hence_response_may_be_stack_allocated(self)
    }
    pub fn r#flexible_x_union_hence_response_must_be_heap_allocated(
        &self,
    ) -> fidl::client::QueryResponseFut<(OlderSimpleUnion)> {
        TestProtocolProxyInterface::r#flexible_x_union_hence_response_must_be_heap_allocated(self)
    }
}

impl TestProtocolProxyInterface for TestProtocolProxy {
    type StrictXUnionHenceResponseMayBeStackAllocatedResponseFut =
        fidl::client::QueryResponseFut<(StrictBoundedXUnion)>;
    fn r#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 r#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(dead_code)]
    channel: &'a fidl::Channel,
}

#[allow(deprecated)]
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 },
}

#[allow(deprecated)]
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(())
        })
    }
}
