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

library fidl_example_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;

import 'package:fidl_someotherlibrary/fidl_async.dart' as lib$someotherlibrary;
// 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 0x4:
        return channel;
      default:
        throw $fidl.FidlError('Invalid strict enum value: $_v',
            $fidl.FidlErrorCode.fidlInvalidEnumValue);
    }
  }
  static const ObjType none = ObjType._(0x0);
  static const ObjType channel = ObjType._(0x4);

  const ObjType._(this.$value);

  @override
  final int $value;

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

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

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

  @override
  bool isUnknown() {
    return false;
  }

  @override
  String toString() {
    switch ($value) {
      case 0x0:
        return r'ObjType.none';
      case 0x4:
        return r'ObjType.channel';
      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, 0x4: null},
    ctor: ObjType._ctor);

class ExampleOfUseOfAliases extends $fidl.Struct {
  const ExampleOfUseOfAliases({
    @required this.fieldOfU32,
    @required this.fieldOfVecAtMostFiveOfString,
    @required this.fieldOfVecAtMostFiveOfUint32,
    @required this.fieldOfVecOfStrings,
    @required this.fieldOfVecOfStringsAtMostNine,
    @required this.fieldOfVecOfStringsAtMost5,
    @required this.fieldOfVecAtMost5OfReferenceMe,
    @required this.fieldOfChannel,
    @required this.fieldOfClientEnd,
    this.fieldOfNullableClientEnd,
  });
  ExampleOfUseOfAliases.clone(
    ExampleOfUseOfAliases $orig, {
    int fieldOfU32,
    List<String> fieldOfVecAtMostFiveOfString,
    Uint32List fieldOfVecAtMostFiveOfUint32,
    List<String> fieldOfVecOfStrings,
    List<String> fieldOfVecOfStringsAtMostNine,
    List<String> fieldOfVecOfStringsAtMost5,
    List<lib$someotherlibrary.ReferenceMe> fieldOfVecAtMost5OfReferenceMe,
    $zircon.Handle fieldOfChannel,
    $zircon.Handle fieldOfClientEnd,
    $zircon.Handle fieldOfNullableClientEnd,
  }) : this(
          fieldOfU32: fieldOfU32 ?? $orig.fieldOfU32,
          fieldOfVecAtMostFiveOfString: fieldOfVecAtMostFiveOfString ??
              $orig.fieldOfVecAtMostFiveOfString,
          fieldOfVecAtMostFiveOfUint32: fieldOfVecAtMostFiveOfUint32 ??
              $orig.fieldOfVecAtMostFiveOfUint32,
          fieldOfVecOfStrings: fieldOfVecOfStrings ?? $orig.fieldOfVecOfStrings,
          fieldOfVecOfStringsAtMostNine: fieldOfVecOfStringsAtMostNine ??
              $orig.fieldOfVecOfStringsAtMostNine,
          fieldOfVecOfStringsAtMost5:
              fieldOfVecOfStringsAtMost5 ?? $orig.fieldOfVecOfStringsAtMost5,
          fieldOfVecAtMost5OfReferenceMe: fieldOfVecAtMost5OfReferenceMe ??
              $orig.fieldOfVecAtMost5OfReferenceMe,
          fieldOfChannel: fieldOfChannel ?? $orig.fieldOfChannel,
          fieldOfClientEnd: fieldOfClientEnd ?? $orig.fieldOfClientEnd,
          fieldOfNullableClientEnd:
              fieldOfNullableClientEnd ?? $orig.fieldOfNullableClientEnd,
        );

  ExampleOfUseOfAliases.cloneWithout(
    ExampleOfUseOfAliases $orig, {
    bool fieldOfNullableClientEnd,
  }) : this(
          fieldOfU32: $orig.fieldOfU32,
          fieldOfVecAtMostFiveOfString: $orig.fieldOfVecAtMostFiveOfString,
          fieldOfVecAtMostFiveOfUint32: $orig.fieldOfVecAtMostFiveOfUint32,
          fieldOfVecOfStrings: $orig.fieldOfVecOfStrings,
          fieldOfVecOfStringsAtMostNine: $orig.fieldOfVecOfStringsAtMostNine,
          fieldOfVecOfStringsAtMost5: $orig.fieldOfVecOfStringsAtMost5,
          fieldOfVecAtMost5OfReferenceMe: $orig.fieldOfVecAtMost5OfReferenceMe,
          fieldOfChannel: $orig.fieldOfChannel,
          fieldOfClientEnd: $orig.fieldOfClientEnd,
          fieldOfNullableClientEnd:
              fieldOfNullableClientEnd ? null : $orig.fieldOfNullableClientEnd,
        );

  final int fieldOfU32;
  final List<String> fieldOfVecAtMostFiveOfString;
  final Uint32List fieldOfVecAtMostFiveOfUint32;
  final List<String> fieldOfVecOfStrings;
  final List<String> fieldOfVecOfStringsAtMostNine;
  final List<String> fieldOfVecOfStringsAtMost5;
  final List<lib$someotherlibrary.ReferenceMe> fieldOfVecAtMost5OfReferenceMe;
  final $zircon.Handle fieldOfChannel;
  final $zircon.Handle fieldOfClientEnd;
  final $zircon.Handle fieldOfNullableClientEnd;

  @override
  List<Object> get $fields {
    return <Object>[
      fieldOfU32,
      fieldOfVecAtMostFiveOfString,
      fieldOfVecAtMostFiveOfUint32,
      fieldOfVecOfStrings,
      fieldOfVecOfStringsAtMostNine,
      fieldOfVecOfStringsAtMost5,
      fieldOfVecAtMost5OfReferenceMe,
      fieldOfChannel,
      fieldOfClientEnd,
      fieldOfNullableClientEnd,
    ];
  }

  static const $fieldType0 = $fidl.Uint32Type();
  static const $fieldType1 = $fidl.VectorType<List<String>>(
      element: $fidl.StringType(maybeElementCount: null, nullable: false),
      maybeElementCount: 5,
      nullable: false);
  static const $fieldType2 = $fidl.VectorType<Uint32List>(
      element: $fidl.Uint32Type(), maybeElementCount: 5, nullable: false);
  static const $fieldType3 = $fidl.VectorType<List<String>>(
      element: $fidl.StringType(maybeElementCount: null, nullable: false),
      maybeElementCount: null,
      nullable: false);
  static const $fieldType4 = $fidl.VectorType<List<String>>(
      element: $fidl.StringType(maybeElementCount: null, nullable: false),
      maybeElementCount: 9,
      nullable: false);
  static const $fieldType5 = $fidl.VectorType<List<String>>(
      element: $fidl.StringType(maybeElementCount: null, nullable: false),
      maybeElementCount: 5,
      nullable: false);
  static const $fieldType6 =
      $fidl.VectorType<List<lib$someotherlibrary.ReferenceMe>>(
          element: lib$someotherlibrary.kReferenceMe_Type,
          maybeElementCount: 5,
          nullable: false);
  static const $fieldType7 = $fidl.HandleType(nullable: false);
  static const $fieldType8 = $fidl.HandleType(nullable: false);
  static const $fieldType9 = $fidl.HandleType(nullable: true);

  @override
  void $encode($fidl.Encoder $encoder, int $offset) {
    $fieldType0.encode($encoder, fieldOfU32, $offset + 0);
    $fieldType1.encode($encoder, fieldOfVecAtMostFiveOfString, $offset + 8);
    $fieldType2.encode($encoder, fieldOfVecAtMostFiveOfUint32, $offset + 24);
    $fieldType3.encode($encoder, fieldOfVecOfStrings, $offset + 40);
    $fieldType4.encode($encoder, fieldOfVecOfStringsAtMostNine, $offset + 56);
    $fieldType5.encode($encoder, fieldOfVecOfStringsAtMost5, $offset + 72);
    $fieldType6.encode($encoder, fieldOfVecAtMost5OfReferenceMe, $offset + 88);
    $fieldType7.encode($encoder, fieldOfChannel, $offset + 104);
    $fieldType8.encode($encoder, fieldOfClientEnd, $offset + 108);
    $fieldType9.encode($encoder, fieldOfNullableClientEnd, $offset + 112);
  }

  @override
  String toString() {
    return r'ExampleOfUseOfAliases' r'(fieldOfU32: ' +
        fieldOfU32.toString() +
        r', fieldOfVecAtMostFiveOfString: ' +
        fieldOfVecAtMostFiveOfString.toString() +
        r', fieldOfVecAtMostFiveOfUint32: ' +
        fieldOfVecAtMostFiveOfUint32.toString() +
        r', fieldOfVecOfStrings: ' +
        fieldOfVecOfStrings.toString() +
        r', fieldOfVecOfStringsAtMostNine: ' +
        fieldOfVecOfStringsAtMostNine.toString() +
        r', fieldOfVecOfStringsAtMost5: ' +
        fieldOfVecOfStringsAtMost5.toString() +
        r', fieldOfVecAtMost5OfReferenceMe: ' +
        fieldOfVecAtMost5OfReferenceMe.toString() +
        r', fieldOfChannel: ' +
        fieldOfChannel.toString() +
        r', fieldOfClientEnd: ' +
        fieldOfClientEnd.toString() +
        r', fieldOfNullableClientEnd: ' +
        fieldOfNullableClientEnd.toString() +
        r')';
  }

  static ExampleOfUseOfAliases _structDecode(
      $fidl.Decoder $decoder, int $offset) {
    return ExampleOfUseOfAliases(
        fieldOfU32: $fieldType0.decode($decoder, $offset + 0),
        fieldOfVecAtMostFiveOfString: $fieldType1.decode($decoder, $offset + 8),
        fieldOfVecAtMostFiveOfUint32:
            $fieldType2.decode($decoder, $offset + 24),
        fieldOfVecOfStrings: $fieldType3.decode($decoder, $offset + 40),
        fieldOfVecOfStringsAtMostNine:
            $fieldType4.decode($decoder, $offset + 56),
        fieldOfVecOfStringsAtMost5: $fieldType5.decode($decoder, $offset + 72),
        fieldOfVecAtMost5OfReferenceMe:
            $fieldType6.decode($decoder, $offset + 88),
        fieldOfChannel: $fieldType7.decode($decoder, $offset + 104),
        fieldOfClientEnd: $fieldType8.decode($decoder, $offset + 108),
        fieldOfNullableClientEnd: $fieldType9.decode($decoder, $offset + 112));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<ExampleOfUseOfAliases> kExampleOfUseOfAliases_Type =
    $fidl.StructType<ExampleOfUseOfAliases>(
  inlineSize: 120,
  structDecode: ExampleOfUseOfAliases._structDecode,
);

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