Skip to content

Commit ef0ea7f

Browse files
Extract common model (#6)
Co-authored-by: wilmveel <[email protected]>
1 parent e67ace2 commit ef0ea7f

File tree

22 files changed

+1799
-1751
lines changed

22 files changed

+1799
-1751
lines changed

.github/workflows/build.yml

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@ name: Build
22

33
on:
44
push:
5+
branches: [master]
6+
pull_request:
7+
branches: [master]
8+
release:
9+
types: [published]
10+
workflow_dispatch:
11+
inputs:
12+
version:
13+
description: 'Version to deploy'
14+
required: true
15+
type: string
516

617
jobs:
718
build:
@@ -13,10 +24,22 @@ jobs:
1324
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
1425
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
1526

27+
1628
steps:
1729
- name: Checkout project sources
1830
uses: actions/checkout@v2
1931
- name: Setup Gradle
2032
uses: gradle/gradle-build-action@v2
33+
34+
- name: Set version from input
35+
if: github.event_name == 'workflow_dispatch'
36+
run: |
37+
echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
38+
39+
- name: Set version from release
40+
if: github.event_name == 'release'
41+
run: |
42+
echo "VERSION=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
43+
2144
- name: Run build with Gradle Wrapper
22-
run: ./gradlew build publishToSonatype closeSonatypeStagingRepository
45+
run: ./gradlew build publishToSonatype closeSonatypeStagingRepository

.sdkmanrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Enable auto-env through the sdkman_auto_env config
2+
# Add key=value pairs of SDKs to use below
3+
java=17.0.14-tem

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.PHONY: *
22

33
# The first command will be invoked with `make` only and should be `all`
4-
all: clean build
4+
all: clean format build
55

66
build:
77
./gradlew build

README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ dependencies {
5656
### OpenAPI v3
5757

5858
```kotlin
59-
// Using community.flock.kotlinx.openapi.bindings.v3.OpenAPI
60-
// and community.flock.kotlinx.openapi.bindings.v3.OpenAPIObject
59+
// Using community.flock.kotlinx.openapi.bindings.OpenAPIV3
60+
// and community.flock.kotlinx.openapi.bindings.OpenAPIV3Model
6161

6262
val json = """
6363
{
@@ -93,17 +93,17 @@ val json = """
9393
"""
9494

9595
// Parse OpenAPI JSON to Kotlin object
96-
val obj: OpenAPIObject = OpenAPI.decodeFromString(json)
96+
val obj: OpenAPIV3Model = OpenAPIV3.decodeFromString(json)
9797

98-
// Serialize Kotlin object back to JSON
99-
val str: String = OpenAPI.encodeToString(obj)
98+
// Serialize a Kotlin object back to JSON
99+
val str: String = OpenAPIV3.encodeToString(obj)
100100
```
101101

102102
### OpenAPI v2 (Swagger)
103103

104104
```kotlin
105-
// Using community.flock.kotlinx.openapi.bindings.v2.OpenAPI
106-
// and community.flock.kotlinx.openapi.bindings.v2.OpenAPIObject
105+
// Using community.flock.kotlinx.openapi.bindings.OpenAPIV2
106+
// and community.flock.kotlinx.openapi.bindings.OpenAPIV2Model
107107

108108
val json = """
109109
{
@@ -135,10 +135,10 @@ val json = """
135135
"""
136136

137137
// Parse Swagger JSON to Kotlin object
138-
val obj: OpenAPIObject = OpenAPI.decodeFromString(json)
138+
val obj: OpenAPIV2Model = OpenAPIV2.decodeFromString(json)
139139

140-
// Serialize Kotlin object back to JSON
141-
val str: String = OpenAPI.encodeToString(obj)
140+
// Serialize a Kotlin object back to JSON
141+
val str: String = OpenAPIV2.encodeToString(obj)
142142
```
143143

144144
### Handling x-properties

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[versions]
2-
default = "0.1.4"
2+
default = "0.0.0-SNAPSHOT"
33
from_env = "VERSION"
44
group_id = "community.flock.kotlinx.openapi.bindings"
55
java = "17"
Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
@file:OptIn(ExperimentalSerializationApi::class, InternalSerializationApi::class)
2+
3+
package community.flock.kotlinx.openapi.bindings
4+
5+
import kotlinx.serialization.ExperimentalSerializationApi
6+
import kotlinx.serialization.InternalSerializationApi
7+
import kotlinx.serialization.Serializable
8+
import kotlinx.serialization.json.JsonElement
9+
import kotlinx.serialization.json.JsonPrimitive
10+
import kotlin.jvm.JvmInline
11+
12+
sealed interface ResponseOrReference
13+
sealed interface HeaderOrReference
14+
sealed interface ParameterOrReference
15+
sealed interface SchemaOrReference
16+
sealed interface SchemaOrReferenceOrBoolean
17+
sealed interface CallbackOrReference
18+
sealed interface LinkOrReference
19+
sealed interface ExampleOrReference
20+
sealed interface RequestBodyOrReference
21+
sealed interface SecuritySchemeOrReference
22+
23+
sealed interface OpenAPIModel {
24+
val info: InfoObject
25+
val paths: Map<Path, PathItem>
26+
val security: List<Map<String, List<String>>>?
27+
val tags: List<TagObject>?
28+
val externalDocs: ExternalDocumentation?
29+
val xProperties: Map<String, JsonElement>?
30+
}
31+
32+
sealed interface PathItem {
33+
val parameters: List<ParameterOrReference>?
34+
val ref: String?
35+
val summary: String?
36+
val description: String?
37+
val get: Operation?
38+
val put: Operation?
39+
val post: Operation?
40+
val delete: Operation?
41+
val options: Operation?
42+
val head: Operation?
43+
val patch: Operation?
44+
val trace: Operation?
45+
val servers: List<Server>?
46+
val xProperties: Map<String, JsonElement>?
47+
}
48+
49+
sealed interface Operation {
50+
val parameters: List<ParameterOrReference>?
51+
val requestBody: RequestBodyOrReference?
52+
val responses: Map<StatusCode, ResponseOrReference>?
53+
val callbacks: Map<String, CallbackOrReference>?
54+
val tags: List<String?>?
55+
val summary: String?
56+
val description: String?
57+
val externalDocs: ExternalDocumentation?
58+
val operationId: String?
59+
val deprecated: Boolean?
60+
val security: List<Map<String, List<String>>>?
61+
val servers: List<Server>?
62+
val xProperties: Map<String, JsonElement>?
63+
}
64+
65+
sealed interface RequestBody {
66+
val description: String?
67+
val content: Map<MediaType, MediaTypeObject>?
68+
val required: Boolean?
69+
val xProperties: Map<String, JsonElement>?
70+
}
71+
72+
sealed interface MediaTypeObject {
73+
val schema: SchemaOrReference?
74+
val examples: Map<String, JsonElement>?
75+
val example: JsonElement?
76+
val encoding: Map<String, EncodingProperty>?
77+
}
78+
79+
sealed interface EncodingProperty {
80+
val contentType: String?
81+
val headers: Map<String, HeaderOrReference>?
82+
val style: String?
83+
val explode: Boolean?
84+
val allowReserved: Boolean?
85+
}
86+
87+
sealed interface Link {
88+
val operationRef: String?
89+
val operationId: String?
90+
val parameters: Map<String, JsonElement>?
91+
val requestBody: JsonElement?
92+
val description: String?
93+
val server: Server?
94+
}
95+
96+
sealed interface Response {
97+
val description: String?
98+
val headers: Map<String, HeaderOrReference>?
99+
val links: Map<String, LinkOrReference>?
100+
val xProperties: Map<String, JsonElement>?
101+
}
102+
103+
sealed interface Header {
104+
val description: String?
105+
val xProperties: Map<String, JsonElement>?
106+
}
107+
108+
sealed interface Parameter {
109+
val schema: SchemaOrReference?
110+
val name: String
111+
val xProperties: Map<String, JsonElement>?
112+
}
113+
114+
sealed interface SecurityScheme {
115+
val description: String?
116+
val name: String?
117+
val `in`: String?
118+
}
119+
120+
sealed interface BooleanValue {
121+
val value: Boolean
122+
}
123+
124+
sealed interface Schema {
125+
val example: JsonElement?
126+
val readOnly: Boolean?
127+
val xml: XML?
128+
val externalDocs: ExternalDocumentation?
129+
val title: String?
130+
val description: String?
131+
val default: JsonElement?
132+
val multipleOf: Double?
133+
val uniqueItems: Boolean?
134+
val maxProperties: Int?
135+
val minProperties: Int?
136+
val required: List<String>?
137+
val enum: List<JsonPrimitive>?
138+
val items: SchemaOrReference?
139+
val allOf: List<SchemaOrReference>?
140+
val properties: Map<String, SchemaOrReference>?
141+
val additionalProperties: SchemaOrReferenceOrBoolean?
142+
val xProperties: Map<String, JsonElement>?
143+
val format: String?
144+
val maximum: Double?
145+
val exclusiveMaximum: Boolean?
146+
val minimum: Double?
147+
val exclusiveMinimum: Boolean?
148+
val maxLength: Int?
149+
val minLength: Int?
150+
val pattern: String?
151+
val maxItems: Int?
152+
val minItems: Int?
153+
}
154+
155+
sealed interface Reference {
156+
val ref: Ref
157+
}
158+
159+
@Serializable
160+
data class InfoObject(
161+
val title: String,
162+
val description: String? = null,
163+
val termsOfService: String? = null,
164+
val contact: ContactObject? = null,
165+
val license: LicenseObject? = null,
166+
val version: String,
167+
val xProperties: Map<String, JsonElement>? = null,
168+
)
169+
170+
@JvmInline
171+
@Serializable
172+
value class Ref(val value: String)
173+
174+
@JvmInline
175+
@Serializable
176+
value class MediaType(val value: String)
177+
178+
@JvmInline
179+
@Serializable
180+
value class StatusCode(val value: String)
181+
182+
@JvmInline
183+
@Serializable
184+
value class Path(val value: String)
185+
186+
@Serializable
187+
data class Server(
188+
val url: String,
189+
val description: String? = null,
190+
val variables: Map<String, ServerVariableObject>? = null,
191+
)
192+
193+
@Serializable
194+
data class ServerVariableObject(
195+
val enum: List<JsonPrimitive>? = null,
196+
val default: JsonElement? = null,
197+
val description: String? = null,
198+
)
199+
200+
@Serializable
201+
data class TagObject(
202+
val name: String,
203+
val description: String? = null,
204+
val externalDocs: ExternalDocumentation? = null,
205+
)
206+
207+
@Serializable
208+
data class ExternalDocumentation(
209+
val description: String? = null,
210+
val url: String,
211+
)
212+
213+
@Serializable
214+
data class ContactObject(
215+
val name: String? = null,
216+
val url: String? = null,
217+
val email: String? = null,
218+
)
219+
220+
@Serializable
221+
data class LicenseObject(
222+
val name: String,
223+
val url: String? = null,
224+
)
225+
226+
@Serializable
227+
data class XML(
228+
val name: String? = null,
229+
val namespace: String? = null,
230+
val prefix: String? = null,
231+
val attribute: Boolean? = null,
232+
val wrapped: Boolean? = null,
233+
)
234+
235+
inline val <reified T> T.simpleName get() = T::class.simpleName!!

0 commit comments

Comments
 (0)