blob: 7112e06252aaa260228bd031e11b15b6cd6c8028 [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of '../protoc.dart';
class ClientApiGenerator {
// The service that this Client API connects to.
final ServiceGenerator service;
final String className;
final Set<String> usedMethodNames = {...reservedMemberNames};
/// Tag of `ServiceDescriptorProto.method`.
static const serviceDescriptorMethodTag = 2;
/// Tag of `FileDescriptorProto.service`.
static const fileDescriptorServiceTag = 6;
/// Index of the service in `FileDescriptorProto.service` repeated field.
final int _repeatedFieldIndex;
late final List<int> _serviceDescriptorPath = [
...service.fileGen.fieldPath,
fileDescriptorServiceTag,
_repeatedFieldIndex
];
List<int> _methodDescriptorPath(int methodIndex) {
return [
..._serviceDescriptorPath,
serviceDescriptorMethodTag,
methodIndex,
];
}
ClientApiGenerator(
this.service, Set<String> usedNames, this._repeatedFieldIndex)
: className = disambiguateName(
avoidInitialUnderscore(service._descriptor.name),
usedNames,
defaultSuffixes());
// Subclasses can override this.
String get _clientType => '$protobufImportPrefix.RpcClient';
void generate(IndentingWriter out) {
final commentBlock = service.fileGen.commentBlock(_serviceDescriptorPath);
if (commentBlock != null) {
out.println(commentBlock);
}
if (service._descriptor.options.deprecated) {
out.println(
'@$coreImportPrefix.Deprecated(\'This service is deprecated\')');
}
out.addBlock('class ${className}Api {', '}', () {
out.println('$_clientType _client;');
out.println('${className}Api(this._client);');
out.println();
for (var i = 0; i < service._descriptor.method.length; i++) {
generateMethod(out, service._descriptor.method[i], i);
}
});
out.println();
}
// Subclasses can override this.
void generateMethod(
IndentingWriter out, MethodDescriptorProto method, int methodIndex) {
final methodName = disambiguateName(
avoidInitialUnderscore(service._methodName(method.name)),
usedMethodNames,
defaultSuffixes());
final inputType =
service._getDartClassName(method.inputType, forMainFile: true);
final outputType =
service._getDartClassName(method.outputType, forMainFile: true);
final commentBlock =
service.fileGen.commentBlock(_methodDescriptorPath(methodIndex));
if (commentBlock != null) {
out.println(commentBlock);
}
if (method.options.deprecated) {
out.println(
'@$coreImportPrefix.Deprecated(\'This method is deprecated\')');
}
out.addBlock(
'$asyncImportPrefix.Future<$outputType> $methodName('
'$protobufImportPrefix.ClientContext? ctx, $inputType request) =>',
';', () {
out.println('_client.invoke<$outputType>(ctx, \'$className\', '
'\'${method.name}\', request, $outputType())');
});
}
}