Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions cmd/oapi-codegen/oapi-codegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"gopkg.in/yaml.v2"

"github.com/oapi-codegen/oapi-codegen/v2/pkg/codegen"
sampleservice "github.com/oapi-codegen/oapi-codegen/v2/pkg/codegen/sample_service"
"github.com/oapi-codegen/oapi-codegen/v2/pkg/util"
)

Expand All @@ -47,6 +48,7 @@ var (
flagPrintUsage bool
flagGenerate string
flagTemplatesDir string
flagServiceName string

// Deprecated: The options below will be removed in a future
// release. Please use the new config file format.
Expand Down Expand Up @@ -98,6 +100,7 @@ func main() {
flag.StringVar(&flagPackageName, "package", "", "The package name for generated code.")
flag.BoolVar(&flagPrintUsage, "help", false, "Show this help and exit.")
flag.BoolVar(&flagPrintUsage, "h", false, "Same as -help.")
flag.StringVar(&flagServiceName, "service", "", "The service name for which code is being generated.")

// All flags below are deprecated, and will be removed in a future release. Please do not
// update their behavior.
Expand All @@ -121,6 +124,14 @@ func main() {
os.Exit(0)
}

if flagServiceName != "" {
err := sampleservice.GenerateMinimalService(flagServiceName)
if err != nil {
errExit("error generating minimal service: %s\n", err)
}
return
}

if flagPrintVersion {
bi, ok := debug.ReadBuildInfo()
if !ok {
Expand Down
67 changes: 67 additions & 0 deletions pkg/codegen/sample_service/generate_minimal_service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package sampleservice

import (
"embed"
"fmt"
"io/fs"
"os"
"os/exec"
"path/filepath"
)

//go:embed sample_service_app/*
var minimalServiceFS embed.FS

// GenerateMinimalService generates a minimal service application structure
func GenerateMinimalService(serviceName string) error {
sourceDir := "sample_service_app"
cWd, err := os.Getwd()
if err != nil {
return err
}

servicePath := filepath.Join(cWd, serviceName)
if _, err := os.Stat(servicePath); !os.IsNotExist(err) {
return fmt.Errorf("directory %s already exists", serviceName)
}
err = os.Mkdir(servicePath, 0755)
if err != nil {
return err
}
err = fs.WalkDir(minimalServiceFS, sourceDir, func(path string, d fs.DirEntry, err error) error {
if err != nil {
fmt.Println("error walking the path:", err)
}
if path == sourceDir { //skip the root directory
return nil
}
relPath, err := filepath.Rel(sourceDir, path)
if err != nil {
return err
}
localPath := filepath.Join(servicePath, relPath)

if d.IsDir() {
return os.MkdirAll(localPath, 0755)
}
data, err := minimalServiceFS.ReadFile(path)
if err != nil {
return err
}
return os.WriteFile(localPath, data, 0644)
})
if err != nil {
return err
}
err = os.Chdir(servicePath)
if err != nil {
return fmt.Errorf("failed to change directory: %w", err)
}
cmd := exec.Command("go", "mod", "init", serviceName)
err = cmd.Run()
if err != nil {
return fmt.Errorf("failed to initialize go module: %w", err)
}
fmt.Println("Minimal service application structure generated successfully in ", servicePath)
return nil
}
1 change: 1 addition & 0 deletions pkg/codegen/sample_service/sample_service_app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Sample service readme
3 changes: 3 additions & 0 deletions pkg/codegen/sample_service/sample_service_app/api/api.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package api

//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=cfg.yaml api.yaml
19 changes: 19 additions & 0 deletions pkg/codegen/sample_service/sample_service_app/api/api.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
openapi: 3.0.0
info:
title: Sample API
version: 1.0.0
paths:
/hello:
get:
summary: Returns a greeting message.
responses:
'200':
description: A successful response
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: Hello, World!
6 changes: 6 additions & 0 deletions pkg/codegen/sample_service/sample_service_app/api/cfg.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package: api
generate:
std-http-server: true
embedded-spec: true
models: true
output: api.gen.go
19 changes: 19 additions & 0 deletions pkg/codegen/sample_service/sample_service_app/cmd/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package main

import (
"log"
"net/http"
)

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write([]byte("Hello, World!"))
if err != nil {
http.Error(w, "Failed to write response", http.StatusInternalServerError)
}
})
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatalf("Failed to start server: %v", err)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// package model contains data models for the Sample Service application.
package model
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// package routes contains route definitions and handlers for the Sample Service application.
package routes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// package util contains utility functions for the Sample Service application.
package util