// WARNING: This file is machine generated by fidlgen_dart.
// @dart = 2.8

library fidl_fidl_test_handlesintypes_async;

import 'dart:async' as $async;
import 'dart:core' hide Set;
import 'dart:developer';
import 'dart:typed_data';

import 'package:fidl/fidl.dart' as $fidl;
import 'package:meta/meta.dart';
import 'package:zircon/zircon.dart' as $zircon;

// ignore_for_file: always_specify_types
// ignore_for_file: avoid_positional_boolean_parameters
// ignore_for_file: avoid_returning_null
// ignore_for_file: cascade_invocations
// ignore_for_file: constant_identifier_names
// ignore_for_file: one_member_abstracts
// ignore_for_file: prefer_constructors_over_static_methods
// ignore_for_file: prefer_single_quotes
// ignore_for_file: public_member_api_docs
// ignore_for_file: unused_import
// ignore_for_file: unused_local_variable
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: library_prefixes
// ignore_for_file: prefer_typing_uninitialized_variables
// ignore_for_file: avoid_js_rounded_ints
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: prefer_generic_function_type_aliases
// ignore_for_file: prefer_equal_for_default_values
// ignore_for_file: avoid_catches_without_on_clauses
// ignore_for_file: unused_shown_name
// ignore_for_file: unnecessary_lambdas
// ignore_for_file: comment_references
// ignore_for_file: avoid_unused_constructor_parameters
// ignore_for_file: prefer_interpolation_to_compose_strings

class ObjType extends $fidl.Enum {
  factory ObjType(int _v) {
    switch (_v) {
      case 0x0:
        return none;
      case 0x3:
        return vmo;
      default:
        throw $fidl.FidlError('Invalid strict enum value: $_v',
            $fidl.FidlErrorCode.fidlInvalidEnumValue);
    }
  }
  static const ObjType none = ObjType._(0x0);
  static const ObjType vmo = ObjType._(0x3);

  const ObjType._(this.$value);

  @override
  final int $value;

  static const Map<String, ObjType> $valuesMap = {
    r'none': none,
    r'vmo': vmo,
  };

  static const List<ObjType> $values = [
    none,
    vmo,
  ];

  static ObjType $valueOf(String name) => $valuesMap[name];

  @override
  bool isUnknown() {
    return false;
  }

  @override
  String toString() {
    switch ($value) {
      case 0x0:
        return r'ObjType.none';
      case 0x3:
        return r'ObjType.vmo';
      default:
        return r'ObjType.' '${$value}';
    }
  }

  static ObjType _ctor(int v) => ObjType(v);
}

const $fidl.EnumType<ObjType> kobj_type_Type = $fidl.EnumType<ObjType>(
    type: $fidl.Uint32Type(),
    values: {0x0: null, 0x3: null},
    ctor: ObjType._ctor);

enum UnionWithHandleTag {
  $unknown,
  h, // 0x1
}

const Map<int, UnionWithHandleTag> _UnionWithHandleTag_map = {
  1: UnionWithHandleTag.h,
};

class UnionWithHandle extends $fidl.XUnion {
  const UnionWithHandle.withH($zircon.Vmo value)
      : _ordinal = 1,
        _data = value;
  const UnionWithHandle.with$UnknownData(
      this._ordinal, $fidl.UnknownRawData data)
      : _data = data;

  UnionWithHandle._(int ordinal, Object data)
      : _ordinal = ordinal,
        _data = data;

  final int _ordinal;
  final _data;

  UnionWithHandleTag get $tag {
    final UnionWithHandleTag $rawtag = _UnionWithHandleTag_map[_ordinal];
    return $rawtag == null ? UnionWithHandleTag.$unknown : $rawtag;
  }

  $zircon.Vmo get h {
    if (_ordinal != 1) {
      return null;
    }
    return _data;
  }

  @override
  String toString() {
    switch (_ordinal) {
      case 1:
        return r'UnionWithHandle.h(' + h.toString() + ')';
      default:
        return r'UnionWithHandle.<UNKNOWN>';
    }
  }

  @override
  int get $ordinal => _ordinal;

  @override
  Object get $data => _data;

  static UnionWithHandle _ctor(int ordinal, Object data) {
    return UnionWithHandle._(ordinal, data);
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionWithHandle> kUnionWithHandle_Type =
    $fidl.XUnionType<UnionWithHandle>(
  members: <int, $fidl.FidlType>{
    1: $fidl.VmoType(nullable: false),
  },
  ctor: UnionWithHandle._ctor,
  nullable: false,
  flexible: true,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionWithHandle> kUnionWithHandle_OptType =
    $fidl.XUnionType<UnionWithHandle>(
  members: <int, $fidl.FidlType>{
    1: $fidl.VmoType(nullable: false),
  },
  ctor: UnionWithHandle._ctor,
  nullable: true,
  flexible: true,
);

class HandlesInTypes extends $fidl.Struct {
  const HandlesInTypes({
    @required this.normalHandle,
    @required this.handleInVec,
    @required this.handleInArray,
    @required this.handleInMixedVecArray,
    @required this.tableWithHandle,
    @required this.unionWithHandle,
  });
  HandlesInTypes.clone(
    HandlesInTypes $orig, {
    $zircon.Vmo normalHandle,
    List<$zircon.Vmo> handleInVec,
    List<$zircon.Vmo> handleInArray,
    List<List<$zircon.Vmo>> handleInMixedVecArray,
    TableWithHandle tableWithHandle,
    UnionWithHandle unionWithHandle,
  }) : this(
          normalHandle: normalHandle ?? $orig.normalHandle,
          handleInVec: handleInVec ?? $orig.handleInVec,
          handleInArray: handleInArray ?? $orig.handleInArray,
          handleInMixedVecArray:
              handleInMixedVecArray ?? $orig.handleInMixedVecArray,
          tableWithHandle: tableWithHandle ?? $orig.tableWithHandle,
          unionWithHandle: unionWithHandle ?? $orig.unionWithHandle,
        );

  final $zircon.Vmo normalHandle;
  final List<$zircon.Vmo> handleInVec;
  final List<$zircon.Vmo> handleInArray;
  final List<List<$zircon.Vmo>> handleInMixedVecArray;
  final TableWithHandle tableWithHandle;
  final UnionWithHandle unionWithHandle;

  @override
  List<Object> get $fields {
    return <Object>[
      normalHandle,
      handleInVec,
      handleInArray,
      handleInMixedVecArray,
      tableWithHandle,
      unionWithHandle,
    ];
  }

  static const $fieldType0 = $fidl.VmoType(nullable: false);
  static const $fieldType1 = $fidl.VectorType<List<$zircon.Vmo>>(
      element: $fidl.VmoType(nullable: false),
      maybeElementCount: null,
      nullable: false);
  static const $fieldType2 = $fidl.ArrayType<List<$zircon.Vmo>>(
      element: $fidl.VmoType(nullable: false), elementCount: 5);
  static const $fieldType3 = $fidl.VectorType<List<List<$zircon.Vmo>>>(
      element: $fidl.ArrayType<List<$zircon.Vmo>>(
          element: $fidl.VmoType(nullable: false), elementCount: 5),
      maybeElementCount: null,
      nullable: false);
  static const $fieldType4 = kTableWithHandle_Type;
  static const $fieldType5 = kUnionWithHandle_Type;

  @override
  void $encode($fidl.Encoder $encoder, int $offset) {
    $fieldType0.encode($encoder, normalHandle, $offset + 0);
    $fieldType1.encode($encoder, handleInVec, $offset + 8);
    $fieldType2.encode($encoder, handleInArray, $offset + 24);
    $fieldType3.encode($encoder, handleInMixedVecArray, $offset + 48);
    $fieldType4.encode($encoder, tableWithHandle, $offset + 64);
    $fieldType5.encode($encoder, unionWithHandle, $offset + 80);
  }

  @override
  String toString() {
    return r'HandlesInTypes' r'(normalHandle: ' +
        normalHandle.toString() +
        r', handleInVec: ' +
        handleInVec.toString() +
        r', handleInArray: ' +
        handleInArray.toString() +
        r', handleInMixedVecArray: ' +
        handleInMixedVecArray.toString() +
        r', tableWithHandle: ' +
        tableWithHandle.toString() +
        r', unionWithHandle: ' +
        unionWithHandle.toString() +
        r')';
  }

  static HandlesInTypes _structDecode($fidl.Decoder $decoder, int $offset) {
    return HandlesInTypes(
        normalHandle: $fieldType0.decode($decoder, $offset + 0),
        handleInVec: $fieldType1.decode($decoder, $offset + 8),
        handleInArray: $fieldType2.decode($decoder, $offset + 24),
        handleInMixedVecArray: $fieldType3.decode($decoder, $offset + 48),
        tableWithHandle: $fieldType4.decode($decoder, $offset + 64),
        unionWithHandle: $fieldType5.decode($decoder, $offset + 80));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<HandlesInTypes> kHandlesInTypes_Type =
    $fidl.StructType<HandlesInTypes>(
  inlineSize: 104,
  structDecode: HandlesInTypes._structDecode,
);

class TableWithHandle extends $fidl.Table {
  const TableWithHandle({
    this.$unknownData,
    this.h,
  });

  TableWithHandle._(Map<int, dynamic> argv, this.$unknownData) : h = argv[1];

  @override
  final Map<int, $fidl.UnknownRawData> $unknownData;
  final $zircon.Vmo h;

  @override
  dynamic $field(int index) {
    switch (index) {
      case 0:
        return h;
    }
    return null;
  }

  @override
  Map<int, dynamic> get $fields {
    return {
      1: h,
    };
  }

  static TableWithHandle _ctor(Map<int, dynamic> argv,
          [Map<int, $fidl.UnknownRawData> unknownData]) =>
      TableWithHandle._(argv, unknownData);
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.TableType<TableWithHandle> kTableWithHandle_Type =
    $fidl.TableType<TableWithHandle>(
  inlineSize: 16,
  members: [
    $fidl.VmoType(nullable: false),
  ],
  ctor: TableWithHandle._ctor,
);

// ignore: unused_element, avoid_private_typedef_functions
typedef _VoidCallback = void Function();
