Skip to content

Commit e640397

Browse files
committed
started impl
1 parent 32fdd7c commit e640397

16 files changed

Lines changed: 977 additions & 0 deletions

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaSttp4JsoniterClientCodegen.java

Lines changed: 605 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# {{artifactId}}
2+
3+
{{appName}}
4+
- API version: {{appVersion}}
5+
{{^hideGenerationTimestamp}}
6+
- Build date: {{generatedDate}}
7+
{{/hideGenerationTimestamp}}
8+
- Generator version: {{generatorVersion}}
9+
10+
{{{appDescriptionWithNewLines}}}
11+
12+
{{#infoUrl}}
13+
For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}})
14+
{{/infoUrl}}
15+
16+
*Automatically generated by the [OpenAPI Generator](https://openapi-generator.tech)*
17+
18+
## Requirements
19+
20+
Building the API client library requires:
21+
1. Java 1.7+
22+
2. Maven/Gradle/SBT
23+
24+
## Installation
25+
26+
To install the API client library to your local Maven repository, simply execute:
27+
28+
```shell
29+
mvn clean install
30+
```
31+
32+
To deploy it to a remote Maven repository instead, configure the settings of the repository and execute:
33+
34+
```shell
35+
mvn clean deploy
36+
```
37+
38+
Refer to the [OSSRH Guide](http://central.sonatype.org/pages/ossrh-guide.html) for more information.
39+
40+
### Maven users
41+
42+
Add this dependency to your project's POM:
43+
44+
```xml
45+
<dependency>
46+
<groupId>{{{groupId}}}</groupId>
47+
<artifactId>{{{artifactId}}}</artifactId>
48+
<version>{{{artifactVersion}}}</version>
49+
<scope>compile</scope>
50+
</dependency>
51+
```
52+
53+
### Gradle users
54+
55+
Add this dependency to your project's build file:
56+
57+
```groovy
58+
compile "{{{groupId}}}:{{{artifactId}}}:{{{artifactVersion}}}"
59+
```
60+
61+
### SBT users
62+
63+
```scala
64+
libraryDependencies += "{{{groupId}}}" % "{{{artifactId}}}" % "{{{artifactVersion}}}"
65+
```
66+
67+
## Getting Started
68+
69+
## Documentation for API Endpoints
70+
71+
All URIs are relative to *{{basePath}}*
72+
73+
Class | Method | HTTP request | Description
74+
------------ | ------------- | ------------- | -------------
75+
{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}*{{classname}}* | **{{operationId}}** | **{{httpMethod}}** {{path}} | {{summary}}
76+
{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
77+
78+
## Documentation for Models
79+
80+
{{#models}}{{#model}} - [{{classname}}]({{modelDocPath}}{{classname}}.md)
81+
{{/model}}{{/models}}
82+
83+
<a id="documentation-for-authorization"></a>
84+
## Documentation for Authorization
85+
86+
{{^authMethods}}Endpoints do not require authorization.{{/authMethods}}
87+
{{#hasAuthMethods}}Authentication schemes defined for the API:{{/hasAuthMethods}}
88+
{{#authMethods}}
89+
<a id="{{name}}"></a>
90+
### {{name}}
91+
92+
{{#isApiKey}}- **Type**: API key
93+
- **API key parameter name**: {{keyParamName}}
94+
- **Location**: {{#isKeyInQuery}}URL query string{{/isKeyInQuery}}{{#isKeyInHeader}}HTTP header{{/isKeyInHeader}}
95+
{{/isApiKey}}
96+
{{#isBasicBasic}}- **Type**: HTTP basic authentication
97+
{{/isBasicBasic}}
98+
{{#isBasicBearer}}- **Type**: HTTP Bearer Token authentication{{#bearerFormat}} ({{{.}}}){{/bearerFormat}}
99+
{{/isBasicBearer}}
100+
{{#isHttpSignature}}- **Type**: HTTP signature authentication
101+
{{/isHttpSignature}}
102+
{{#isOAuth}}- **Type**: OAuth
103+
- **Flow**: {{flow}}
104+
- **Authorization URL**: {{authorizationUrl}}
105+
- **Scopes**: {{^scopes}}N/A{{/scopes}}
106+
{{#scopes}} - {{scope}}: {{description}}
107+
{{/scopes}}
108+
{{/isOAuth}}
109+
110+
{{/authMethods}}
111+
112+
## Author
113+
114+
{{#apiInfo}}{{#apis}}{{#-last}}{{infoEmail}}
115+
{{/-last}}{{/apis}}{{/apiInfo}}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package {{invokerPackage}}
2+
3+
import java.net.{ URI, URISyntaxException }
4+
5+
{{#circe}}
6+
trait AdditionalTypeSerializers {
7+
import com.github.plokhotnyuk.jsoniter_scala._
8+
9+
implicit final lazy val URICodec: JsonValueCodec[URI] = new JsonValueCodec[URI] {
10+
def nullValue: URI = null
11+
def decodeValue(in: JsonReader, default: URI): URI = ???
12+
def encodeValue(uri: URI, out: JsonWriter): Unit = ???
13+
}
14+
}
15+
{{/circe}}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{{>licenseInfo}}
2+
package {{package}}
3+
4+
{{#imports}}
5+
import {{import}}
6+
{{/imports}}
7+
import {{invokerPackage}}.JsonSupport._
8+
import sttp.client4._
9+
import sttp.model.Method
10+
11+
{{#operations}}
12+
object {{classname}} {
13+
def apply(baseUrl: String = "{{{basePath}}}") = new {{classname}}(baseUrl)
14+
}
15+
16+
class {{classname}}(baseUrl: String) {
17+
18+
{{#operation}}
19+
{{#javadocRenderer}}
20+
{{>javadoc}}
21+
{{/javadocRenderer}}
22+
def {{operationId}}({{>methodParameters}}): Request[{{#separateErrorChannel}}Either[ResponseException[String, Exception], {{>operationReturnType}}]{{/separateErrorChannel}}{{^separateErrorChannel}}{{>operationReturnType}}{{/separateErrorChannel}}] =
23+
basicRequest
24+
.method(Method.{{httpMethod.toUpperCase}}, uri"$baseUrl{{{path}}}{{#queryParams.0}}?{{#queryParams}}{{baseName}}=${ {{{paramName}}} }{{^-last}}&{{/-last}}{{/queryParams}}{{/queryParams.0}}{{#isApiKey}}{{#isKeyInQuery}}{{^queryParams.0}}?{{/queryParams.0}}{{#queryParams.0}}&{{/queryParams.0}}{{keyParamName}}=${apiKey.value}&{{/isKeyInQuery}}{{/isApiKey}}")
25+
.contentType({{#consumes.0}}"{{{mediaType}}}"{{/consumes.0}}{{^consumes}}"application/json"{{/consumes}}){{#headerParams}}
26+
.header({{>paramCreation}}){{/headerParams}}{{#authMethods}}{{#isBasic}}{{#isBasicBasic}}
27+
.auth.basic(username, password){{/isBasicBasic}}{{#isBasicBearer}}
28+
.auth.bearer(bearerToken){{/isBasicBearer}}{{/isBasic}}{{#isApiKey}}{{#isKeyInHeader}}
29+
.header("{{keyParamName}}", apiKey){{/isKeyInHeader}}{{#isKeyInCookie}}
30+
.cookie("{{keyParamName}}", apiKey){{/isKeyInCookie}}{{/isApiKey}}{{/authMethods}}{{#formParams.0}}{{^isMultipart}}
31+
.body(Map({{#formParams}}
32+
{{>paramFormCreation}}{{^-last}},{{/-last}}{{/formParams}}
33+
)){{/isMultipart}}{{#isMultipart}}
34+
.multipartBody(Seq({{#formParams}}
35+
{{>paramMultipartCreation}}{{^-last}}, {{/-last}}{{/formParams}}
36+
).flatten){{/isMultipart}}{{/formParams.0}}{{#bodyParam}}
37+
.body({{paramName}}){{/bodyParam}}
38+
.response({{#separateErrorChannel}}{{^returnType}}asString.mapWithMetadata(ResponseAs.deserializeRightWithError(_ => Right(()))){{/returnType}}{{#returnType}}asJson[{{>operationReturnType}}]{{/returnType}}{{/separateErrorChannel}}{{^separateErrorChannel}}{{^returnType}}asString.mapWithMetadata(ResponseAs.deserializeRightWithError(_ => Right(()))).getRight{{/returnType}}{{#returnType}}asJson[{{>operationReturnType}}].getRight{{/returnType}}{{/separateErrorChannel}})
39+
40+
{{/operation}}
41+
}
42+
{{/operations}}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
version := "{{artifactVersion}}"
2+
name := "{{artifactId}}"
3+
organization := "{{groupId}}"
4+
5+
scalaVersion := "3.3.4"
6+
crossScalaVersions := Seq(scalaVersion.value, "2.13.15")
7+
8+
libraryDependencies ++= Seq(
9+
"com.softwaremill.sttp.client4" %% "core" % "{{sttpClientVersion}}",
10+
"com.softwaremill.sttp.client4" %% "jsoniter" % "{{sttpClientVersion}}",
11+
{{#joda}}
12+
"joda-time" % "joda-time" % "{{jodaTimeVersion}}",
13+
{{/joda}}
14+
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "{{jsoniterVersion}}",
15+
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "{{jsoniterVersion}}" % "compile-internal",
16+
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-circe" % "{{jsoniterVersion}}"
17+
)
18+
19+
scalacOptions := Seq(
20+
"-unchecked",
21+
"-deprecation",
22+
"-feature"
23+
)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{{#notes}}
2+
{{{.}}}
3+
4+
{{/notes}}
5+
Expected answers:
6+
{{#responses}}
7+
code {{code}} : {{{dataType}}} {{#message}}({{{.}}}){{/message}}
8+
{{#headers}}
9+
{{#-first}}
10+
Headers :
11+
{{/-first}}
12+
{{{baseName}}} - {{{description}}}
13+
{{/headers}}
14+
{{/responses}}
15+
{{#authMethods.0}}
16+
17+
Available security schemes:
18+
{{#authMethods}}
19+
{{name}} ({{type}})
20+
{{/authMethods}}
21+
{{/authMethods.0}}
22+
23+
{{#allParams}}
24+
@param {{{paramName}}} {{{description}}}
25+
{{/allParams}}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{{>licenseInfo}}
2+
package {{invokerPackage}}
3+
4+
{{#models.0}}
5+
import {{modelPackage}}._
6+
{{/models.0}}
7+
{{#json4s}}
8+
import org.json4s._
9+
import sttp.client4.json4s.SttpJson4sApi
10+
import scala.reflect.ClassTag
11+
12+
object JsonSupport extends SttpJson4sApi {
13+
def enumSerializers: Seq[Serializer[_]] = Seq[Serializer[_]](){{#models}}{{#model}}{{#isEnum}} :+
14+
new EnumNameSerializer({{classname}}){{/isEnum}}{{#hasEnums}}{{#vars}}{{#isEnum}} :+
15+
new EnumNameSerializer({{classname}}Enums.{{datatypeWithEnum}}){{/isEnum}}{{/vars}}{{/hasEnums}}{{/model}}{{/models}}
16+
17+
private class EnumNameSerializer[E <: Enumeration: ClassTag](enumeration: E) extends Serializer[E#Value] {
18+
import JsonDSL._
19+
val EnumerationClass: Class[E#Value] = classOf[E#Value]
20+
21+
def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), E#Value] = {
22+
case (t @ TypeInfo(EnumerationClass, _), json) if isValid(json) =>
23+
json match {
24+
case JString(value) => enumeration.withName(value)
25+
case value => throw new MappingException(s"Can't convert $value to $EnumerationClass")
26+
}
27+
}
28+
29+
private[this] def isValid(json: JValue) = json match {
30+
case JString(value) if enumeration.values.exists(_.toString == value) => true
31+
case _ => false
32+
}
33+
34+
def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
35+
case i: E#Value => i.toString
36+
}
37+
}
38+
39+
implicit val format: Formats = DefaultFormats ++ enumSerializers ++ DateSerializers.all ++ AdditionalTypeSerializers.all
40+
implicit val serialization: org.json4s.Serialization = org.json4s.jackson.Serialization
41+
}
42+
{{/json4s}}
43+
{{#circe}}
44+
import io.circe.{Decoder, Encoder}
45+
import io.circe.generic.AutoDerivation
46+
import sttp.client3.circe.SttpCirceApi
47+
48+
object JsonSupport extends SttpCirceApi with AutoDerivation with DateSerializers with AdditionalTypeSerializers {
49+
50+
{{#models}}
51+
{{#model}}
52+
{{#isEnum}}
53+
implicit val {{classname}}Decoder: Decoder[{{classname}}.{{classname}}] = Decoder.decodeEnumeration({{classname}})
54+
implicit val {{classname}}Encoder: Encoder[{{classname}}.{{classname}}] = Encoder.encodeEnumeration({{classname}})
55+
{{/isEnum}}
56+
{{/model}}
57+
{{/models}}
58+
}
59+
{{/circe}}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* {{{appName}}}
3+
* {{{appDescription}}}
4+
*
5+
* {{#version}}The version of the OpenAPI document: {{{.}}}{{/version}}
6+
* {{#infoEmail}}Contact: {{{.}}}{{/infoEmail}}
7+
*
8+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9+
* https://openapi-generator.tech
10+
* Do not edit the class manually.
11+
*/
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{#authMethods.0}}{{#authMethods}}{{#isApiKey}}apiKey: String{{/isApiKey}}{{#isBasic}}{{#isBasicBasic}}username: String, password: String{{/isBasicBasic}}{{#isBasicBearer}}bearerToken: String{{/isBasicBearer}}{{/isBasic}}{{^-last}}, {{/-last}}{{/authMethods}})({{/authMethods.0}}{{#allParams}}{{paramName}}: {{#required}}{{dataType}}{{/required}}{{^required}}{{#isContainer}}{{dataType}}{{/isContainer}}{{^isContainer}}Option[{{dataType}}]{{/isContainer}}{{/required}}{{^defaultValue}}{{^required}}{{^isContainer}} = None{{/isContainer}}{{/required}}{{/defaultValue}}{{^-last}}, {{/-last}}{{/allParams}}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{{>licenseInfo}}
2+
package {{package}}
3+
4+
{{#imports}}
5+
import {{import}}
6+
{{/imports}}
7+
8+
{{#models}}
9+
{{#model}}
10+
{{#description}}
11+
{{#javadocRenderer}}
12+
{{#title}}
13+
{{{.}}}
14+
{{/title}}
15+
{{{description}}}
16+
{{/javadocRenderer}}
17+
{{/description}}
18+
{{^isEnum}}
19+
case class {{classname}}(
20+
{{#vars}}
21+
{{#description}}
22+
/* {{{.}}} */
23+
{{/description}}
24+
{{{name}}}: {{^required}}Option[{{/required}}{{^isEnum}}{{dataType}}{{/isEnum}}{{#isEnum}}{{^isArray}}{{classname}}Enums.{{datatypeWithEnum}}{{/isArray}}{{#isArray}}Seq[{{classname}}Enums.{{datatypeWithEnum}}]{{/isArray}}{{/isEnum}}{{^required}}] = None{{/required}}{{^-last}},{{/-last}}
25+
{{/vars}}
26+
)
27+
{{/isEnum}}
28+
29+
{{#isEnum}}
30+
object {{classname}} extends Enumeration {
31+
type {{classname}} = {{classname}}.Value
32+
{{#allowableValues}}
33+
{{#values}}
34+
val {{#fnEnumEntry}}{{.}}{{/fnEnumEntry}} = Value("{{.}}")
35+
{{/values}}
36+
{{/allowableValues}}
37+
}
38+
{{/isEnum}}
39+
{{#hasEnums}}
40+
object {{classname}}Enums {
41+
42+
{{#vars}}
43+
{{#isEnum}}
44+
type {{datatypeWithEnum}} = {{datatypeWithEnum}}.Value
45+
{{/isEnum}}
46+
{{/vars}}
47+
{{#vars}}
48+
{{#isEnum}}
49+
object {{datatypeWithEnum}} extends Enumeration {
50+
{{#_enum}}
51+
val {{#fnEnumEntry}}{{.}}{{/fnEnumEntry}} = Value("{{.}}")
52+
{{/_enum}}
53+
}
54+
55+
{{/isEnum}}
56+
{{/vars}}
57+
}
58+
{{/hasEnums}}
59+
{{/model}}
60+
{{/models}}

0 commit comments

Comments
 (0)