Skip to content

Commit

Permalink
[groovy] support enum generation in groovy client (#15619)
Browse files Browse the repository at this point in the history
* support generation of enums for groovy

* add custom json generator for groovy

* add nestet enums in groovy templates

* add indent for nested Groovy enums & fix compilation errors in Groovy ApiUtils

* save auto generated samples&docs for groovy
  • Loading branch information
dyadyaJora committed May 24, 2023
1 parent 358397f commit 5b5cb1f
Show file tree
Hide file tree
Showing 7 changed files with 149 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,41 @@
package {{invokerPackage}}

import groovy.json.JsonBuilder
import groovy.json.JsonGenerator
import groovyx.net.http.ChainedHttpConfig
import groovyx.net.http.ContentTypes
import groovyx.net.http.NativeHandlers
import groovyx.net.http.ToServer

import static groovyx.net.http.HttpBuilder.configure
import static java.net.URI.create

class ApiUtils {
static def jsonGenerator = new JsonGenerator.Options()
.addConverter(Enum) { Enum u, String key ->
u.toString()
}
.build()

void invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType, method, container, type) {
def (url, uriPath) = buildUrlAndUriPath(basePath, versionPath, resourcePath)
println "url=$url uriPath=$uriPath"
def http = configure {
request.uri = url
request.uri.path = uriPath
request.encoder(ContentTypes.JSON, { final ChainedHttpConfig config, final ToServer ts ->
final ChainedHttpConfig.ChainedRequest request = config.getChainedRequest();
if (NativeHandlers.Encoders.handleRawUpload(config, ts)) {
return;
}

final Object body = NativeHandlers.Encoders.checkNull(request.actualBody());
final String json = ((body instanceof String || body instanceof GString)
? body.toString()
: new JsonBuilder(body, jsonGenerator).toString());
ts.toServer(NativeHandlers.Encoders.stringToStream(json, request.actualCharset()));
})
}
.invokeMethod(String.valueOf(method).toLowerCase()) {
request.uri.query = queryParams
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,6 @@ import {{import}};

{{#models}}
{{#model}}
@Canonical
class {{classname}} {
{{#vars}}
{{#description}}/* {{{.}}} */{{/description}}
{{{dataType}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}
{{/vars}}
}
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{>modelClass}}{{/isEnum}}
{{/model}}
{{/models}}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@Canonical
class {{classname}} {
{{#vars}}
{{#isEnum}}

{{^isContainer}}
{{#lambda.indented}}
{{>modelEnum}}{{/lambda.indented}}
{{/isContainer}}
{{#isContainer}}
{{#mostInnerItems}}
{{#lambda.indented}}
{{>modelEnum}}{{/lambda.indented}}
{{/mostInnerItems}}
{{/isContainer}}

{{/isEnum}}
{{#description}}/* {{{.}}} */{{/description}}
{{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}
{{/vars}}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} {
{{#allowableValues}}{{#enumVars}}
{{#enumDescription}}
/**
* {{.}}
*/
{{/enumDescription}}
{{{name}}}({{{value}}}){{^-last}},
{{/-last}}{{/enumVars}}{{/allowableValues}}

private final {{{dataType}}} value

{{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) {
this.value = value
}

{{{dataType}}} getValue() {
value
}

@Override
String toString() {
String.valueOf(value)
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,41 @@
package org.openapitools.api

import groovy.json.JsonBuilder
import groovy.json.JsonGenerator
import groovyx.net.http.ChainedHttpConfig
import groovyx.net.http.ContentTypes
import groovyx.net.http.NativeHandlers
import groovyx.net.http.ToServer

import static groovyx.net.http.HttpBuilder.configure
import static java.net.URI.create

class ApiUtils {

static def jsonGenerator = new JsonGenerator.Options()
.addConverter(Enum) { Enum u, String key ->
u.toString()
}
.build()

void invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType, method, container, type) {
def (url, uriPath) = buildUrlAndUriPath(basePath, versionPath, resourcePath)
println "url=$url uriPath=$uriPath"
def http = configure {
request.uri = url
request.uri.path = uriPath
request.encoder(ContentTypes.JSON, { final ChainedHttpConfig config, final ToServer ts ->
final ChainedHttpConfig.ChainedRequest request = config.getChainedRequest();
if (NativeHandlers.Encoders.handleRawUpload(config, ts)) {
return;
}

final Object body = NativeHandlers.Encoders.checkNull(request.actualBody());
final String json = ((body instanceof String || body instanceof GString)
? body.toString()
: new JsonBuilder(body, jsonGenerator).toString());
ts.toServer(NativeHandlers.Encoders.stringToStream(json, request.actualCharset()));
})
}
.invokeMethod(String.valueOf(method).toLowerCase()) {
request.uri.query = queryParams
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,33 @@ class Order {
Integer quantity

Date shipDate

enum StatusEnum {

PLACED("placed"),

APPROVED("approved"),

DELIVERED("delivered")

private final String value

StatusEnum(String value) {
this.value = value
}

String getValue() {
value
}

@Override
String toString() {
String.valueOf(value)
}
}

/* Order Status */
String status
StatusEnum status

Boolean complete = false
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,31 @@ class Pet {
List<String> photoUrls = new ArrayList<>()

List<Tag> tags

enum StatusEnum {

AVAILABLE("available"),

PENDING("pending"),

SOLD("sold")

private final String value

StatusEnum(String value) {
this.value = value
}

String getValue() {
value
}

@Override
String toString() {
String.valueOf(value)
}
}

/* pet status in the store */
String status
StatusEnum status
}

0 comments on commit 5b5cb1f

Please sign in to comment.