// 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_bits, fidl_empty_struct, fidl_enum, fidl_struct, fidl_struct_copy, fidl_table,
        fidl_union, 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),
}

impl PizzaOrPasta {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for PizzaOrPasta {}

fidl_union! {
    name: PizzaOrPasta,
    members: [
        Pizza {
            ty: Pizza,
            ordinal: 1,
        },
        Pasta {
            ty: Pasta,
            ordinal: 2,
        },
    ],
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ExplicitPizzaOrPasta {
    Pizza(Pizza),
    Pasta(Pasta),
}

impl ExplicitPizzaOrPasta {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for ExplicitPizzaOrPasta {}

fidl_union! {
    name: ExplicitPizzaOrPasta,
    members: [
        Pizza {
            ty: Pizza,
            ordinal: 1,
        },
        Pasta {
            ty: Pasta,
            ordinal: 4,
        },
    ],
}

#[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 {
    () => {
        _
    };
}

impl FlexiblePizzaOrPasta {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for FlexiblePizzaOrPasta {}

fidl_union! {
    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),
}

impl StrictPizzaOrPasta {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for StrictPizzaOrPasta {}

fidl_union! {
    name: StrictPizzaOrPasta,
    members: [
        Pizza {
            ty: Pizza,
            ordinal: 1,
        },
        Pasta {
            ty: Pasta,
            ordinal: 2,
        },
    ],
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum Union {
    Primitive(i32),
    StringNeedsConstructor(String),
    VectorStringAlsoNeedsConstructor(Vec<String>),
}

impl Union {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for Union {}

fidl_union! {
    name: Union,
    members: [
        Primitive {
            ty: i32,
            ordinal: 1,
        },
        StringNeedsConstructor {
            ty: String,
            ordinal: 2,
        },
        VectorStringAlsoNeedsConstructor {
            ty: Vec<String>,
            ordinal: 3,
        },
    ],
}

#[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 {
    () => {
        _
    };
}

impl FlexibleUnion {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for FlexibleUnion {}

fidl_union! {
    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>),
}

impl StrictUnion {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for StrictUnion {}

fidl_union! {
    name: StrictUnion,
    members: [
        Primitive {
            ty: i32,
            ordinal: 1,
        },
        StringNeedsConstructor {
            ty: String,
            ordinal: 2,
        },
        VectorStringAlsoNeedsConstructor {
            ty: Vec<String>,
            ordinal: 3,
        },
    ],
}

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum FieldCollision {
    FieldCollisionTag(i32),
}

impl FieldCollision {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for FieldCollision {}

fidl_union! {
    name: FieldCollision,
    members: [
        FieldCollisionTag {
            ty: i32,
            ordinal: 1,
        },
    ],
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ExplicitUnion {
    Primitive(i32),
    StringNeedsConstructor(String),
}

impl ExplicitUnion {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for ExplicitUnion {}

fidl_union! {
    name: ExplicitUnion,
    members: [
        Primitive {
            ty: i32,
            ordinal: 1,
        },
        StringNeedsConstructor {
            ty: String,
            ordinal: 3,
        },
    ],
}

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ReverseOrdinalUnion {
    Second(u32),
    First(u32),
}

impl ReverseOrdinalUnion {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for ReverseOrdinalUnion {}

fidl_union! {
    name: ReverseOrdinalUnion,
    members: [
        Second {
            ty: u32,
            ordinal: 2,
        },
        First {
            ty: u32,
            ordinal: 1,
        },
    ],
}

#[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 {
    () => {
        _
    };
}

impl FlexibleFoo {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for FlexibleFoo {}

fidl_union! {
    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),
}

impl StrictFoo {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for StrictFoo {}

fidl_union! {
    name: StrictFoo,
    members: [
        S {
            ty: String,
            ordinal: 1,
        },
        I {
            ty: i32,
            ordinal: 2,
        },
    ],
}

#[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 {
    () => {
        _
    };
}

impl ExplicitFoo {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for ExplicitFoo {}

fidl_union! {
    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),
}

impl ExplicitStrictFoo {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for ExplicitStrictFoo {}

fidl_union! {
    name: ExplicitStrictFoo,
    members: [
        S {
            ty: String,
            ordinal: 3,
        },
        I {
            ty: i32,
            ordinal: 2,
        },
    ],
}

#[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 {
    () => {
        _
    };
}

impl OlderSimpleUnion {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for OlderSimpleUnion {}

fidl_union! {
    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 {
    () => {
        _
    };
}

impl NewerSimpleUnion {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for NewerSimpleUnion {}

fidl_union! {
    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),
}

impl StrictSimpleXUnion {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for StrictSimpleXUnion {}

fidl_union! {
    name: StrictSimpleXUnion,
    members: [
        I {
            ty: i32,
            ordinal: 1,
        },
        F {
            ty: f32,
            ordinal: 2,
        },
        S {
            ty: String,
            ordinal: 3,
        },
    ],
}

#[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 {
    () => {
        _
    };
}

impl XUnionContainingEmptyStruct {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for XUnionContainingEmptyStruct {}

fidl_union! {
    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>),
}

impl StrictBoundedXUnion {
    #[deprecated = "Strict unions should not use `validate`"]
    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        Ok(self)
    }

    #[deprecated = "Strict unions should not use `is_unknown`"]
    #[inline]
    pub fn is_unknown(&self) -> bool {
        false
    }
}

impl fidl::encoding::Persistable for StrictBoundedXUnion {}

fidl_union! {
    name: StrictBoundedXUnion,
    members: [
        V {
            ty: Vec<u8>,
            ordinal: 1,
        },
    ],
}

#[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 {
    () => {
        _
    };
}

impl ExplicitXUnion {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for ExplicitXUnion {}

fidl_union! {
    name: ExplicitXUnion,
    members: [
        I {
            ty: i64,
            ordinal: 1,
        },
        F {
            ty: f32,
            ordinal: 4,
        },
    ],
    value_unknown_member: __Unknown,
}

#[derive(Debug, Clone, PartialEq)]
pub enum UnionWithAttributes {
    X(i64),
    #[deprecated = "Use `UnionWithAttributes::unknown()` to construct and `UnionWithAttributesUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        bytes: Vec<u8>,
    },
}
/// Pattern that matches an unknown `UnionWithAttributes` member.
#[macro_export]
macro_rules! UnionWithAttributesUnknown {
    () => {
        _
    };
}

impl UnionWithAttributes {
    #[inline]
    pub fn unknown(ordinal: u64, bytes: Vec<u8>) -> Self {
        #[allow(deprecated)]
        Self::__Unknown { ordinal, bytes }
    }

    #[inline]
    pub fn validate(self) -> std::result::Result<Self, (u64, Vec<u8>)> {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { ordinal, bytes } => Err((ordinal, bytes)),
            _ => Ok(self),
        }
    }

    #[inline]
    pub fn is_unknown(&self) -> bool {
        match self {
            #[allow(deprecated)]
            Self::__Unknown { .. } => true,
            _ => false,
        }
    }
}

impl fidl::encoding::Persistable for UnionWithAttributes {}

fidl_union! {
    name: UnionWithAttributes,
    members: [
        X {
            ty: i64,
            ordinal: 1,
        },
    ],
    value_unknown_member: __Unknown,
}

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

impl fidl::encoding::Persistable for Pizza {}

fidl_struct! {
  name: Pizza,
  members: [
    toppings {
      ty: Vec<String>,
      offset_v1: 0,
      offset_v2: 0,
    },
  ],
  padding_v1: [],
  padding_v2: [],
  size_v1: 16,
  size_v2: 16,
  align_v1: 8,
  align_v2: 8,
}

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

impl fidl::encoding::Persistable for Pasta {}

fidl_struct! {
  name: Pasta,
  members: [
    sauce {
      ty: String,
      offset_v1: 0,
      offset_v2: 0,
    },
  ],
  padding_v1: [],
  padding_v2: [],
  size_v1: 16,
  size_v2: 16,
  align_v1: 8,
  align_v2: 8,
}

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

impl fidl::encoding::Persistable for NullableUnionStruct {}

fidl_struct! {
  name: NullableUnionStruct,
  members: [
    the_union {
      ty: Option<Box<Union>>,
      offset_v1: 0,
      offset_v2: 0,
    },
  ],
  padding_v1: [],
  padding_v2: [],
  size_v1: 24,
  size_v2: 16,
  align_v1: 8,
  align_v2: 8,
}

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

impl fidl::encoding::Persistable for Empty {}

fidl_empty_struct!(Empty);

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

impl fidl::encoding::Persistable for StructWithNullableXUnion {}

fidl_struct! {
  name: StructWithNullableXUnion,
  members: [
    x1 {
      ty: Option<Box<OlderSimpleUnion>>,
      offset_v1: 0,
      offset_v2: 0,
    },
  ],
  padding_v1: [],
  padding_v2: [],
  size_v1: 24,
  size_v2: 16,
  align_v1: 8,
  align_v2: 8,
}

#[derive(Debug, Clone, PartialEq)]
pub struct UnionSandwich {
    pub a: u32,
    pub u: ExplicitXUnion,
    pub b: u32,
}

impl fidl::encoding::Persistable for UnionSandwich {}

fidl_struct! {
  name: UnionSandwich,
  members: [
    a {
      ty: u32,
      offset_v1: 0,
      offset_v2: 0,
    },
    u {
      ty: ExplicitXUnion,
      offset_v1: 8,
      offset_v2: 8,
    },
    b {
      ty: u32,
      offset_v1: 32,
      offset_v2: 24,
    },
  ],
  padding_v1: [
  {
      ty: u64,
      offset: 0,
      mask: 0xffffffff00000000u64,
  },
  {
      ty: u64,
      offset: 32,
      mask: 0xffffffff00000000u64,
  },],
  padding_v2: [
  {
      ty: u64,
      offset: 0,
      mask: 0xffffffff00000000u64,
  },
  {
      ty: u64,
      offset: 24,
      mask: 0xffffffff00000000u64,
  },],
  size_v1: 40,
  size_v2: 32,
  align_v1: 8,
  align_v2: 8,
}

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

impl fidl::endpoints::ProtocolMarker 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 protocol_name = <TestProtocolMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
    }

    pub fn into_channel(self) -> fidl::Channel {
        self.client.into_channel()
    }

    /// Waits until an event arrives and returns it. It is safe for other
    /// threads to make concurrent requests while waiting for an event.
    pub fn wait_for_event(&self, deadline: zx::Time) -> Result<TestProtocolEvent, fidl::Error> {
        TestProtocolEvent::decode(self.client.wait_for_event(deadline)?)
    }
    pub fn r#strict_x_union_hence_response_may_be_stack_allocated(
        &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(
        &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 Protocol = 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 protocol_name = <TestProtocolMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
        Self { client: fidl::client::Client::new(channel, protocol_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 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),
        };

        std::task::Poll::Ready(Some(TestProtocolEvent::decode(buf)))
    }
}

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

impl TestProtocolEvent {
    fn decode(mut buf: fidl::MessageBufEtc) -> Result<TestProtocolEvent, fidl::Error> {
        let (bytes, _handles) = buf.split_mut();
        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;

        match tx_header.ordinal() {
            _ => Err(fidl::Error::UnknownOrdinal {
                ordinal: tx_header.ordinal(),
                protocol_name: <TestProtocolMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
            }),
        }
    }
}

/// 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 Protocol = 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(),
                    protocol_name:
                        <TestProtocolMarker as fidl::endpoints::ProtocolMarker>::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(),
                protocol_name: <TestProtocolMarker as fidl::endpoints::ProtocolMarker>::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(())
        })
    }
}
