Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
stanislav-chetvertkov committed Apr 20, 2024
0 parents commit d5c107a
Show file tree
Hide file tree
Showing 6 changed files with 253 additions and 0 deletions.
12 changes: 12 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "3.4.1"

lazy val root = (project in file("."))
.settings(
name := "zio-http-gen",
libraryDependencies ++= Seq(
"dev.zio" %% "zio-http" % "3.0.0-RC6",
"dev.zio" %% "zio-http-gen" % "3.0.0-RC6"
)
)
6 changes: 6 additions & 0 deletions post.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
curl --location 'http://localhost:8082/pets' \
--header 'Content-Type: application/json' \
--data '{
"id":1,
"name": "name"
}'
1 change: 1 addition & 0 deletions project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version = 1.9.9
190 changes: 190 additions & 0 deletions src/main/resources/petstore-minimal.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
{
"openapi": "3.0.0",
"info": {
"version": "1.0.0",
"title": "Swagger Petstore",
"license": {
"name": "MIT"
}
},
"servers": [
{
"url": "http://petstore.swagger.io/v1"
}
],
"paths": {
"/pets": {
"get": {
"summary": "List all pets",
"operationId": "listPets",
"tags": [
"pets"
],
"parameters": [
{
"name": "limit",
"in": "query",
"description": "How many items to return at one time (max 100)",
"required": false,
"schema": {
"type": "integer",
"maximum": 100,
"format": "int32"
}
}
],
"responses": {
"200": {
"description": "A paged array of pets",
"headers": {
"x-next": {
"description": "A link to the next page of responses",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pets"
}
}
}
},
"default": {
"description": "unexpected error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
},
"post": {
"summary": "Create a pet",
"operationId": "createPets",
"tags": [
"pets"
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pet"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Null response"
},
"default": {
"description": "unexpected error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/pets/{petId}": {
"get": {
"summary": "Info for a specific pet",
"operationId": "showPetById",
"tags": [
"pets"
],
"parameters": [
{
"name": "petId",
"in": "path",
"required": true,
"description": "The id of the pet to retrieve",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Expected response to a valid request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pet"
}
}
}
},
"default": {
"description": "unexpected error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"Pet": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"name": {
"type": "string",
"minLength": 3
},
"tag": {
"type": "string"
}
}
},
"Pets": {
"type": "array",
"maxItems": 100,
"items": {
"$ref": "#/components/schemas/Pet"
}
},
"Error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"message": {
"type": "string"
}
}
}
}
}
}
23 changes: 23 additions & 0 deletions src/main/scala/openapi/generator/example/Example.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package openapi.generator.example

import zio.http.endpoint.openapi.OpenAPI
import zio.http.gen.scala.{Code, CodeGen}

object Example extends App {

val jsonString = scala.io.Source.fromResource("petstore-minimal.json").mkString
val openapi: Either[String, OpenAPI] = OpenAPI.fromJson(jsonString)

val openApiSuccess = openapi match {
case Right(value) => value
case Left(value) => throw new Exception(value)
}

val files: Code.Files = zio.http.gen.openapi.EndpointGen.fromOpenAPI(openApiSuccess)

// 'target' generated

val uri = "target/generated-sources"
CodeGen.writeFiles(files, java.nio.file.Paths.get(uri), "base", None)

}
21 changes: 21 additions & 0 deletions src/main/scala/openapi/generator/example/ServerExample.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package openapi.generator.example

import base.Pets
import base.component.Pet
import zio.http.endpoint.Endpoint
import zio.http.endpoint.EndpointMiddleware.None
import zio.http.{Handler, Route, Server}
import zio.{Scope, ZIO, ZIOAppArgs, ZIOAppDefault, ZNothing}

object ServerExample extends ZIOAppDefault {

val endpoint: Endpoint[Unit, Pet, ZNothing, Unit, None] = Pets.createPets
val route: Route[Any, Nothing] = endpoint.implement(Handler.fromFunctionZIO(pet => {ZIO.logInfo("Pet: " + pet.toString)}))

// create zio http app from the generated endpoint
val httpApp = route.toHttpApp

override def run: ZIO[Any with ZIOAppArgs with Scope, Any, Any] = {
Server.serve(httpApp).provide(Server.defaultWithPort(8082))
}
}

0 comments on commit d5c107a

Please sign in to comment.