///
//  Generated code. Do not modify.
//  source: test
///
// ignore_for_file: non_constant_identifier_names,library_prefixes,unused_import

import 'dart:async';

import 'package:protobuf/protobuf.dart';

import 'test.pb.dart';
import 'test.pbjson.dart';

export 'test.pb.dart';

abstract class TestServiceBase extends GeneratedService {
  Future<Empty> ping(ServerContext ctx, Empty request);

  GeneratedMessage createRequest(String method) {
    switch (method) {
      case 'Ping': return new Empty();
      default: throw new ArgumentError('Unknown method: $method');
    }
  }

  Future<GeneratedMessage> handleCall(ServerContext ctx, String method, GeneratedMessage request) {
    switch (method) {
      case 'Ping': return this.ping(ctx, request);
      default: throw new ArgumentError('Unknown method: $method');
    }
  }

  Map<String, dynamic> get $json => Test$json;
  Map<String, Map<String, dynamic>> get $messageJson => Test$messageJson;
}

