// 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},
};

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

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum UnionLargeArray {
    A([u32; 100]),
}
fidl_xunion! {
    name: UnionLargeArray,
    members: [
        A {
            ty: [u32; 100],
            ordinal: 1,
        },
    ],
    strict_value: true,
}

#[derive(
    Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, zerocopy::AsBytes, zerocopy::FromBytes,
)]
#[repr(C)]
pub struct StructSmallArray {
    pub a: [u32; 2],
}

fidl_struct_copy! {
  name: StructSmallArray,
  members: [
    a {
      ty: [u32; 2],
      offset_v1: 0,
    },
  ],
  padding: [],
  size_v1: 8,
  align_v1: 4,
}

#[derive(
    Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, zerocopy::AsBytes, zerocopy::FromBytes,
)]
#[repr(C)]
pub struct StructLargeArray {
    pub a: [u32; 100],
}

fidl_struct_copy! {
  name: StructLargeArray,
  members: [
    a {
      ty: [u32; 100],
      offset_v1: 0,
    },
  ],
  padding: [],
  size_v1: 400,
  align_v1: 4,
}

#[derive(Debug, Clone, PartialEq)]
pub struct TableSmallArray {
    pub a: Option<[u32; 2]>,
    /// (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, Vec<u8>>>,
    #[deprecated = "Use `..TableSmallArray::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: TableSmallArray,
  members: [
    a {
      ty: [u32; 2],
      ordinal: 1,
    },
  ],
  value_unknown_member: unknown_data,
}

#[derive(Debug, Clone, PartialEq)]
pub struct TableLargeArray {
    pub a: Option<[u32; 100]>,
    /// (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, Vec<u8>>>,
    #[deprecated = "Use `..TableLargeArray::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: TableLargeArray,
  members: [
    a {
      ty: [u32; 100],
      ordinal: 1,
    },
  ],
  value_unknown_member: unknown_data,
}
