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

library fidl_fidl_test_emptystruct_test;

import 'dart:async' as $async;
import 'dart:core' hide Error, Future, Match, Set, Stream, Type;
import 'dart:typed_data';

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

import './fidl_async.dart';

// ignore_for_file: always_specify_types
// ignore_for_file: constant_identifier_names
// ignore_for_file: one_member_abstracts
// ignore_for_file: public_member_api_docs
// ignore_for_file: unused_import
// ignore_for_file: library_prefixes
// ignore_for_file: unused_shown_name

class EmptyProtocol$TestBase extends EmptyProtocol {
  @override
  $async.Future<void> send(Empty e) {
    return $async.Future.error(
        UnimplementedError(
            r'send not implemented on EmptyProtocol test base. Please implement.'),
        StackTrace.current);
  }

  @override
  $async.Stream<Empty> get receive {
    return $async.Stream.fromFuture($async.Future.error(
        UnimplementedError(
            r'receive not implemented on EmptyProtocol test base. Please implement.'),
        StackTrace.current));
  }

  @override
  $async.Future<Empty> sendAndReceive(Empty e) {
    return $async.Future.error(
        UnimplementedError(
            r'sendAndReceive not implemented on EmptyProtocol test base. Please implement.'),
        StackTrace.current);
  }
}
