///
//  Generated code. Do not modify.
//  source: test
//
// @dart = 2.3
// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type

import 'dart:async' as $async;

import 'dart:core' as $core show int, String, List;

import 'package:grpc/service_api.dart' as $grpc;
import 'test.pb.dart' as $0;
export 'test.pb.dart';

class TestClient extends $grpc.Client {
  static final _$unary = $grpc.ClientMethod<$0.Input, $0.Output>(
      '/Test/Unary',
      ($0.Input value) => value.writeToBuffer(),
      ($core.List<$core.int> value) => $0.Output.fromBuffer(value));
  static final _$clientStreaming = $grpc.ClientMethod<$0.Input, $0.Output>(
      '/Test/ClientStreaming',
      ($0.Input value) => value.writeToBuffer(),
      ($core.List<$core.int> value) => $0.Output.fromBuffer(value));
  static final _$serverStreaming = $grpc.ClientMethod<$0.Input, $0.Output>(
      '/Test/ServerStreaming',
      ($0.Input value) => value.writeToBuffer(),
      ($core.List<$core.int> value) => $0.Output.fromBuffer(value));
  static final _$bidirectional = $grpc.ClientMethod<$0.Input, $0.Output>(
      '/Test/Bidirectional',
      ($0.Input value) => value.writeToBuffer(),
      ($core.List<$core.int> value) => $0.Output.fromBuffer(value));

  TestClient($grpc.ClientChannel channel, {$grpc.CallOptions options})
      : super(channel, options: options);

  $grpc.ResponseFuture<$0.Output> unary($0.Input request,
      {$grpc.CallOptions options}) {
    final call = $createCall(_$unary, $async.Stream.fromIterable([request]),
        options: options);
    return $grpc.ResponseFuture(call);
  }

  $grpc.ResponseFuture<$0.Output> clientStreaming(
      $async.Stream<$0.Input> request,
      {$grpc.CallOptions options}) {
    final call = $createCall(_$clientStreaming, request, options: options);
    return $grpc.ResponseFuture(call);
  }

  $grpc.ResponseStream<$0.Output> serverStreaming($0.Input request,
      {$grpc.CallOptions options}) {
    final call = $createCall(
        _$serverStreaming, $async.Stream.fromIterable([request]),
        options: options);
    return $grpc.ResponseStream(call);
  }

  $grpc.ResponseStream<$0.Output> bidirectional($async.Stream<$0.Input> request,
      {$grpc.CallOptions options}) {
    final call = $createCall(_$bidirectional, request, options: options);
    return $grpc.ResponseStream(call);
  }
}

abstract class TestServiceBase extends $grpc.Service {
  $core.String get $name => 'Test';

  TestServiceBase() {
    $addMethod($grpc.ServiceMethod<$0.Input, $0.Output>(
        'Unary',
        unary_Pre,
        false,
        false,
        ($core.List<$core.int> value) => $0.Input.fromBuffer(value),
        ($0.Output value) => value.writeToBuffer()));
    $addMethod($grpc.ServiceMethod<$0.Input, $0.Output>(
        'ClientStreaming',
        clientStreaming,
        true,
        false,
        ($core.List<$core.int> value) => $0.Input.fromBuffer(value),
        ($0.Output value) => value.writeToBuffer()));
    $addMethod($grpc.ServiceMethod<$0.Input, $0.Output>(
        'ServerStreaming',
        serverStreaming_Pre,
        false,
        true,
        ($core.List<$core.int> value) => $0.Input.fromBuffer(value),
        ($0.Output value) => value.writeToBuffer()));
    $addMethod($grpc.ServiceMethod<$0.Input, $0.Output>(
        'Bidirectional',
        bidirectional,
        true,
        true,
        ($core.List<$core.int> value) => $0.Input.fromBuffer(value),
        ($0.Output value) => value.writeToBuffer()));
  }

  $async.Future<$0.Output> unary_Pre(
      $grpc.ServiceCall call, $async.Future<$0.Input> request) async {
    return unary(call, await request);
  }

  $async.Stream<$0.Output> serverStreaming_Pre(
      $grpc.ServiceCall call, $async.Future<$0.Input> request) async* {
    yield* serverStreaming(call, await request);
  }

  $async.Future<$0.Output> unary($grpc.ServiceCall call, $0.Input request);
  $async.Future<$0.Output> clientStreaming(
      $grpc.ServiceCall call, $async.Stream<$0.Input> request);
  $async.Stream<$0.Output> serverStreaming(
      $grpc.ServiceCall call, $0.Input request);
  $async.Stream<$0.Output> bidirectional(
      $grpc.ServiceCall call, $async.Stream<$0.Input> request);
}
