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

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

// methodOnFirst: ()
const int _kFirstProtocol_MethodOnFirst_Ordinal = 0x2838a83100000000;
const $fidl.MethodType _kFirstProtocol_MethodOnFirst_Type = $fidl.MethodType(
  request: null,
  response: null,
  name: r"FirstProtocol.MethodOnFirst",
);

abstract class FirstProtocol extends $fidl.Service {
  static const String $serviceName = null;
  @override
  $fidl.ServiceData get $serviceData => FirstProtocolData();
  $async.Future<void> methodOnFirst();
}

class FirstProtocolData implements $fidl.ServiceData<FirstProtocol> {
  const FirstProtocolData();

  @override
  String getName() {
    return FirstProtocol.$serviceName;
  }

  @override
  $fidl.AsyncBinding getBinding() {
    return FirstProtocolBinding();
  }
}

class FirstProtocolProxy extends $fidl.AsyncProxy<FirstProtocol>
    implements FirstProtocol {
  FirstProtocolProxy()
      : super($fidl.AsyncProxyController<FirstProtocol>(
            $serviceName: null, $interfaceName: r'FirstProtocol')) {
    ctrl.onResponse = _handleResponse;
  }

  @override
  $fidl.ServiceData get $serviceData => FirstProtocolData();

  void _handleEvent($fidl.Message $message) {
    final $fidl.Decoder $decoder = $fidl.Decoder($message);
    switch ($message.ordinal) {
      default:
        ctrl.proxyError(
            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
        ctrl.close();
        break;
    }
  }

  void _handleResponse($fidl.Message $message) {
    final int $txid = $message.txid;
    if ($txid == 0) {
      _handleEvent($message);
      return;
    }
    final $async.Completer $completer = ctrl.getCompleter($txid);
    if ($completer == null) {
      $message.closeHandles();
      return;
    }
    final $fidl.Decoder $decoder = $fidl.Decoder($message);
    switch ($message.ordinal) {
      default:
        ctrl.proxyError(
            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
        ctrl.close();
        break;
    }
  }

  @override
  $async.Future<void> methodOnFirst() async {
    if (!ctrl.isBound) {
      return $async.Future.error(
          $fidl.FidlStateException('Proxy<${ctrl.$interfaceName}> is closed.'),
          StackTrace.current);
    }

    final $fidl.Encoder $encoder = $fidl.Encoder();
    $encoder.encodeMessageHeader(_kFirstProtocol_MethodOnFirst_Ordinal, 0);
    return $async.Future.sync(() {
      ctrl.sendMessage($encoder.message);
    });
  }
}

class FirstProtocolBinding extends $fidl.AsyncBinding<FirstProtocol> {
  FirstProtocolBinding() : super(r"FirstProtocol");

  @override
  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
    final $fidl.Decoder $decoder = $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kFirstProtocol_MethodOnFirst_Ordinal:
        final String _name = _kFirstProtocol_MethodOnFirst_Type.name;
        try {
          Timeline.startSync(_name);
          final List<$fidl.MemberType> $types =
              _kFirstProtocol_MethodOnFirst_Type.request;
          $decoder.claimMemory(16);
          final $async.Future<void> $future = impl.methodOnFirst();
          // ignore: avoid_catches_without_on_clauses
        } catch (_e) {
          close();
          print('Exception handling method call $_name: $_e');
          rethrow;
        } finally {
          Timeline.finishSync();
        }
        break;
      default:
        throw $fidl.FidlError(
            r'Unexpected message name for FirstProtocolBinding');
    }
  }
}

// methodOnSecond: ()
const int _kSecondProtocol_MethodOnSecond_Ordinal = 0xd09c00f00000000;
const $fidl.MethodType _kSecondProtocol_MethodOnSecond_Type = $fidl.MethodType(
  request: null,
  response: null,
  name: r"SecondProtocol.MethodOnSecond",
);

abstract class SecondProtocol extends $fidl.Service {
  static const String $serviceName = null;
  @override
  $fidl.ServiceData get $serviceData => SecondProtocolData();
  $async.Future<void> methodOnSecond();
}

class SecondProtocolData implements $fidl.ServiceData<SecondProtocol> {
  const SecondProtocolData();

  @override
  String getName() {
    return SecondProtocol.$serviceName;
  }

  @override
  $fidl.AsyncBinding getBinding() {
    return SecondProtocolBinding();
  }
}

class SecondProtocolProxy extends $fidl.AsyncProxy<SecondProtocol>
    implements SecondProtocol {
  SecondProtocolProxy()
      : super($fidl.AsyncProxyController<SecondProtocol>(
            $serviceName: null, $interfaceName: r'SecondProtocol')) {
    ctrl.onResponse = _handleResponse;
  }

  @override
  $fidl.ServiceData get $serviceData => SecondProtocolData();

  void _handleEvent($fidl.Message $message) {
    final $fidl.Decoder $decoder = $fidl.Decoder($message);
    switch ($message.ordinal) {
      default:
        ctrl.proxyError(
            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
        ctrl.close();
        break;
    }
  }

  void _handleResponse($fidl.Message $message) {
    final int $txid = $message.txid;
    if ($txid == 0) {
      _handleEvent($message);
      return;
    }
    final $async.Completer $completer = ctrl.getCompleter($txid);
    if ($completer == null) {
      $message.closeHandles();
      return;
    }
    final $fidl.Decoder $decoder = $fidl.Decoder($message);
    switch ($message.ordinal) {
      default:
        ctrl.proxyError(
            $fidl.FidlError('Unexpected message ordinal: ${$message.ordinal}'));
        ctrl.close();
        break;
    }
  }

  @override
  $async.Future<void> methodOnSecond() async {
    if (!ctrl.isBound) {
      return $async.Future.error(
          $fidl.FidlStateException('Proxy<${ctrl.$interfaceName}> is closed.'),
          StackTrace.current);
    }

    final $fidl.Encoder $encoder = $fidl.Encoder();
    $encoder.encodeMessageHeader(_kSecondProtocol_MethodOnSecond_Ordinal, 0);
    return $async.Future.sync(() {
      ctrl.sendMessage($encoder.message);
    });
  }
}

class SecondProtocolBinding extends $fidl.AsyncBinding<SecondProtocol> {
  SecondProtocolBinding() : super(r"SecondProtocol");

  @override
  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
    final $fidl.Decoder $decoder = $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kSecondProtocol_MethodOnSecond_Ordinal:
        final String _name = _kSecondProtocol_MethodOnSecond_Type.name;
        try {
          Timeline.startSync(_name);
          final List<$fidl.MemberType> $types =
              _kSecondProtocol_MethodOnSecond_Type.request;
          $decoder.claimMemory(16);
          final $async.Future<void> $future = impl.methodOnSecond();
          // ignore: avoid_catches_without_on_clauses
        } catch (_e) {
          close();
          print('Exception handling method call $_name: $_e');
          rethrow;
        } finally {
          Timeline.finishSync();
        }
        break;
      default:
        throw $fidl.FidlError(
            r'Unexpected message name for SecondProtocolBinding');
    }
  }
}
