// WARNING: This file is machine generated by fidlgen.

library fidl_test_name_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 $zx;

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

class MyBits extends $fidl.Bits {
  static const MyBits myFirstBit = MyBits._(0x1);
  static const MyBits myOtherBit = MyBits._(0x2);
  static const MyBits $none = MyBits._(0);

  const MyBits._(this.$value);

  MyBits operator |(MyBits other) {
    return MyBits._($value | other.$value);
  }

  MyBits operator &(MyBits other) {
    return MyBits._($value & other.$value);
  }

  @override
  final int $value;

  @override
  String toString() {
    if ($value == null) {
      return null;
    }
    List<String> parts = [];
    if ($value & 0x1 != 0) {
      parts.add(r'MyBits.myFirstBit');
    }
    if ($value & 0x2 != 0) {
      parts.add(r'MyBits.myOtherBit');
    }
    if (parts.isEmpty) {
      return r'MyBits.$none';
    } else {
      return parts.join(" | ");
    }
  }

  static MyBits _ctor(int v) => MyBits._(v);
}

const $fidl.BitsType<MyBits> kMyBits_Type =
    $fidl.BitsType<MyBits>(type: $fidl.Uint32Type(), ctor: MyBits._ctor);

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