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

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

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

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

#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[repr(u32)]
pub enum ObjType {
    None = 0,
    Vmo = 3,
}
fidl_strict_enum! {
    name: ObjType,
    prim_ty: u32,
    members: [
        None { value: 0, },
        Vmo { value: 3, },
    ],
}

#[derive(Debug, PartialEq)]
pub enum UnionWithHandle {
    H(fidl::Vmo),
    #[deprecated = "Use `UnionWithHandle::unknown()` to construct and `UnionWithHandleUnknown!()` to exhaustively match."]
    #[doc(hidden)]
    __Unknown {
        ordinal: u64,
        data: fidl::UnknownData,
    },
}
/// Pattern that matches an unknown UnionWithHandle member.
#[macro_export]
macro_rules! UnionWithHandleUnknown {
    () => {
        _
    };
}
fidl_xunion! {
    name: UnionWithHandle,
    members: [
        H {
            ty: fidl::Vmo,
            ordinal: 1,
            handle_metadata: {
                handle_subtype: fidl::ObjectType::VMO,
                handle_rights: fidl::Rights::from_bits_const(2147483648).unwrap(),
            },
        },
    ],
    resource_unknown_member: __Unknown,
}

#[derive(Debug, PartialEq)]
pub struct HandlesInTypes {
    pub normal_handle: fidl::Vmo,
    pub handle_in_vec: Vec<fidl::Vmo>,
    pub handle_in_array: [fidl::Vmo; 5],
    pub handle_in_mixed_vec_array: Vec<[fidl::Vmo; 5]>,
    pub table_with_handle: TableWithHandle,
    pub union_with_handle: UnionWithHandle,
}

fidl_struct! {
  name: HandlesInTypes,
  members: [
    normal_handle {
      ty: fidl::Vmo,
      offset_v1: 0,
      handle_metadata: {
        handle_subtype: fidl::ObjectType::VMO,
        handle_rights: fidl::Rights::from_bits_const(2147483648).unwrap(),
      },
    },
    handle_in_vec {
      ty: Vec<fidl::Vmo>,
      offset_v1: 8,
      handle_metadata: {
        handle_subtype: fidl::ObjectType::VMO,
        handle_rights: fidl::Rights::from_bits_const(2147483648).unwrap(),
      },
    },
    handle_in_array {
      ty: [fidl::Vmo; 5],
      offset_v1: 24,
      handle_metadata: {
        handle_subtype: fidl::ObjectType::VMO,
        handle_rights: fidl::Rights::from_bits_const(2147483648).unwrap(),
      },
    },
    handle_in_mixed_vec_array {
      ty: Vec<[fidl::Vmo; 5]>,
      offset_v1: 48,
      handle_metadata: {
        handle_subtype: fidl::ObjectType::VMO,
        handle_rights: fidl::Rights::from_bits_const(2147483648).unwrap(),
      },
    },
    table_with_handle {
      ty: TableWithHandle,
      offset_v1: 64,
    },
    union_with_handle {
      ty: UnionWithHandle,
      offset_v1: 80,
    },
  ],
  padding: [
  {
      ty: u64,
      offset: 0,
      mask: 0xffffffff00000000u64,
  },
  {
      ty: u64,
      offset: 40,
      mask: 0xffffffff00000000u64,
  },],
  size_v1: 104,
  align_v1: 8,
}

#[derive(Debug, PartialEq)]
pub struct TableWithHandle {
    pub h: Option<fidl::Vmo>,
    /// (FIDL-generated) Unknown fields encountered during decoding, stored as a
    /// map from ordinals to raw data. The `Some` case is always nonempty.
    pub unknown_data: Option<std::collections::BTreeMap<u64, fidl::UnknownData>>,
    #[deprecated = "Use `..TableWithHandle::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: TableWithHandle,
  members: [
    h {
      ty: fidl::Vmo,
      ordinal: 1,
      handle_metadata: {
        handle_subtype: fidl::ObjectType::VMO,
        handle_rights: fidl::Rights::from_bits_const(2147483648).unwrap(),
      },
    },
  ],
  resource_unknown_member: unknown_data,
}
