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