// 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(Debug, Clone, PartialEq)]
pub struct EmptyTable {
    /// (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 `..EmptyTable::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: EmptyTable,
  members: [
  ],
  value_unknown_member: unknown_data,
}

#[derive(Debug, Clone, PartialEq)]
pub struct SimpleTable {
    pub x: Option<i64>,
    pub y: Option<i64>,
    /// (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 `..SimpleTable::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: SimpleTable,
  members: [
    x {
      ty: i64,
      ordinal: 1,
    },
    y {
      ty: i64,
      ordinal: 5,
    },
  ],
  value_unknown_member: unknown_data,
}

#[derive(Debug, Clone, PartialEq)]
pub struct OlderSimpleTable {
    pub x: Option<i64>,
    /// (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 `..OlderSimpleTable::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: OlderSimpleTable,
  members: [
    x {
      ty: i64,
      ordinal: 1,
    },
  ],
  value_unknown_member: unknown_data,
}

#[derive(Debug, Clone, PartialEq)]
pub struct NewerSimpleTable {
    pub x: Option<i64>,
    pub y: Option<i64>,
    pub z: Option<i64>,
    /// (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 `..NewerSimpleTable::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: NewerSimpleTable,
  members: [
    x {
      ty: i64,
      ordinal: 1,
    },
    y {
      ty: i64,
      ordinal: 5,
    },
    z {
      ty: i64,
      ordinal: 6,
    },
  ],
  value_unknown_member: unknown_data,
}

#[derive(Debug, Clone, PartialEq)]
pub struct ReverseOrdinalTable {
    pub z: Option<i64>,
    pub y: Option<i64>,
    pub x: Option<i64>,
    /// (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 `..ReverseOrdinalTable::EMPTY` to construct and `..` to match."]
    #[doc(hidden)]
    pub __non_exhaustive: (),
}

fidl_table! {
  name: ReverseOrdinalTable,
  members: [
    z {
      ty: i64,
      ordinal: 1,
    },
    y {
      ty: i64,
      ordinal: 2,
    },
    x {
      ty: i64,
      ordinal: 3,
    },
  ],
  value_unknown_member: unknown_data,
}
