[dart] Improved library specific template usage (#10742)

This commit is contained in:
Peter Leibiger 2022-04-10 03:53:55 +02:00 committed by GitHub
parent a34f992c95
commit 51c48510a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 44 additions and 13 deletions

View File

@ -17,9 +17,12 @@
package org.openapitools.codegen.languages;
import com.google.common.collect.Sets;
import com.samskivert.mustache.Mustache;
import com.samskivert.mustache.Template;
import io.swagger.v3.oas.models.media.Schema;
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.*;
import org.openapitools.codegen.api.TemplatePathLocator;
import org.openapitools.codegen.config.GlobalSettings;
import org.openapitools.codegen.meta.GeneratorMetadata;
import org.openapitools.codegen.meta.Stability;
@ -28,6 +31,10 @@ import org.openapitools.codegen.model.ModelMap;
import org.openapitools.codegen.model.ModelsMap;
import org.openapitools.codegen.model.OperationMap;
import org.openapitools.codegen.model.OperationsMap;
import org.openapitools.codegen.templating.CommonTemplateContentLocator;
import org.openapitools.codegen.templating.GeneratorTemplateContentLocator;
import org.openapitools.codegen.templating.MustacheEngineAdapter;
import org.openapitools.codegen.templating.TemplateManagerOptions;
import org.openapitools.codegen.utils.ModelUtils;
import org.openapitools.codegen.utils.ProcessUtils;
import org.slf4j.Logger;
@ -58,6 +65,8 @@ public class DartDioNextClientCodegen extends AbstractDartCodegen {
private String clientName;
private TemplateManager templateManager;
public DartDioNextClientCodegen() {
super();
@ -178,6 +187,28 @@ public class DartDioNextClientCodegen extends AbstractDartCodegen {
configureSerializationLibraryBuiltValue(srcFolder);
break;
}
TemplateManagerOptions templateManagerOptions = new TemplateManagerOptions(isEnableMinimalUpdate(), isSkipOverwrite());
TemplatePathLocator commonTemplateLocator = new CommonTemplateContentLocator();
TemplatePathLocator generatorTemplateLocator = new GeneratorTemplateContentLocator(this);
templateManager = new TemplateManager(
templateManagerOptions,
getTemplatingEngine(),
new TemplatePathLocator[]{generatorTemplateLocator, commonTemplateLocator}
);
// A lambda which allows for easy includes of serialization library specific
// templates without having to change the main template files.
additionalProperties.put("includeLibraryTemplate", (Mustache.Lambda) (fragment, writer) -> {
MustacheEngineAdapter engine = ((MustacheEngineAdapter) getTemplatingEngine());
String templateFile = "serialization/" + library + "/" + fragment.execute() + ".mustache";
Template tmpl = engine.getCompiler()
.withLoader(name -> engine.findTemplate(templateManager, name))
.defaultValue("")
.compile(templateManager.getFullTemplateContents(templateFile));
fragment.executeTemplate(tmpl, writer);
});
}
private void configureSerializationLibraryBuiltValue(String srcFolder) {

View File

@ -1,7 +1,7 @@
{{>header}}
import 'dart:async';
{{#useBuiltValue}}import 'package:built_value/serializer.dart';{{/useBuiltValue}}
{{#includeLibraryTemplate}}api/imports{{/includeLibraryTemplate}}
import 'package:dio/dio.dart';
{{#operations}}
@ -11,12 +11,8 @@ import 'package:dio/dio.dart';
class {{classname}} {
final Dio _dio;
{{#useBuiltValue}}
final Serializers _serializers;
{{/useBuiltValue}}
const {{classname}}(this._dio{{#useBuiltValue}}, this._serializers{{/useBuiltValue}});
{{#includeLibraryTemplate}}api/constructor{{/includeLibraryTemplate}}
{{#operation}}
/// {{summary}}{{^summary}}{{nickname}}{{/summary}}
@ -88,14 +84,14 @@ class {{classname}} {
final _queryParameters = <String, dynamic>{
{{#queryParams}}
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{baseName}}': {{#useBuiltValue}}{{>serialization/built_value/query_param}}{{/useBuiltValue}},
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{baseName}}': {{#includeLibraryTemplate}}api/query_param{{/includeLibraryTemplate}},
{{/queryParams}}
};{{/hasQueryParams}}{{#hasBodyOrFormParams}}
dynamic _bodyData;
try {
{{#useBuiltValue}}{{>serialization/built_value/serialize}}{{/useBuiltValue}}
{{#includeLibraryTemplate}}api/serialize{{/includeLibraryTemplate}}
} catch(error, stackTrace) {
throw DioError(
requestOptions: _options.compose(
@ -122,7 +118,7 @@ class {{classname}} {
{{{returnType}}} _responseData;
try {
{{#useBuiltValue}}{{>serialization/built_value/deserialize}}{{/useBuiltValue}}
{{#includeLibraryTemplate}}api/deserialize{{/includeLibraryTemplate}}
} catch (error, stackTrace) {
throw DioError(
requestOptions: _response.requestOptions,

View File

@ -1 +1 @@
{{#useBuiltValue}}{{>serialization/built_value/class}}{{/useBuiltValue}}
{{#includeLibraryTemplate}}class{{/includeLibraryTemplate}}

View File

@ -1 +1 @@
{{#useBuiltValue}}{{>serialization/built_value/enum}}{{/useBuiltValue}}
{{#includeLibraryTemplate}}enum{{/includeLibraryTemplate}}

View File

@ -0,0 +1,3 @@
final Serializers _serializers;
const {{classname}}(this._dio, this._serializers);

View File

@ -0,0 +1 @@
import 'package:built_value/serializer.dart';

View File

@ -9,7 +9,7 @@
{{^isMultipart}}
_bodyData = <String, dynamic>{
{{#formParams}}
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{{baseName}}}': {{>serialization/built_value/query_param}},
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{{baseName}}}': {{>serialization/built_value/api/query_param}},
{{/formParams}}
};
{{/isMultipart}}
@ -27,4 +27,4 @@
{{/isContainer}}
_bodyData = {{^required}}{{paramName}} == null ? null : {{/required}}_serializers.serialize({{paramName}}, specifiedType: _type);
{{/isPrimitiveType}}
{{/bodyParam}}
{{/bodyParam}}