api/codegen.go
Snider de63217168 feat: AX v0.8.0 — Core primitives, Result returns, zero disallowed imports
- api.go: errors.Is → core.Is
- openapi.go: Build returns core.Result, encoding/json → core.JSONMarshal
- export.go: rewrite with core.Fs, core.JSONUnmarshal, returns core.Result
- codegen.go: rewrite with c.Process(), core.Fs, App.Find — no os/exec
- sse.go: encoding/json → core.JSONMarshalString, fmt → core.Sprintf
- swagger.go: fmt → core.Sprintf, Build caller updated for core.Result
- middleware.go: strings → core.HasPrefix/SplitN/Lower
- authentik.go: strings → core.HasPrefix/TrimPrefix/Split/Trim/Contains
- brotli.go: strings → core.Contains

Transport boundary files (net/http, io for compression) retained.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-26 08:39:59 +00:00

89 lines
2.5 KiB
Go

// SPDX-License-Identifier: EUPL-1.2
package api
import (
"context"
"iter"
"maps"
"slices"
core "dappco.re/go/core"
)
// Supported SDK target languages.
var supportedLanguages = map[string]string{
"go": "go",
"typescript-fetch": "typescript-fetch",
"typescript-axios": "typescript-axios",
"python": "python",
"java": "java",
"csharp": "csharp-netcore",
"ruby": "ruby",
"swift": "swift5",
"kotlin": "kotlin",
"rust": "rust",
"php": "php",
}
// SDKGenerator wraps openapi-generator-cli for SDK generation.
type SDKGenerator struct {
SpecPath string
OutputDir string
PackageName string
}
// Generate creates an SDK for the given language using openapi-generator-cli.
// Routes through c.Process() — requires go-process registered.
//
// r := gen.Generate(ctx, c, "go")
func (g *SDKGenerator) Generate(ctx context.Context, c *core.Core, language string) core.Result {
generator, ok := supportedLanguages[language]
if !ok {
return core.Result{Value: core.E("SDKGenerator.Generate", core.Sprintf("unsupported language %q", language), nil), OK: false}
}
fs := c.Fs()
if !fs.Exists(g.SpecPath) {
return core.Result{Value: core.E("SDKGenerator.Generate", core.Concat("spec file not found: ", g.SpecPath), nil), OK: false}
}
outputDir := core.JoinPath(g.OutputDir, language)
fs.EnsureDir(outputDir)
args := g.buildArgs(generator, outputDir)
return c.Process().Run(ctx, "openapi-generator-cli", args...)
}
// buildArgs constructs the openapi-generator-cli command arguments.
func (g *SDKGenerator) buildArgs(generator, outputDir string) []string {
args := []string{
"generate",
"-i", g.SpecPath,
"-g", generator,
"-o", outputDir,
}
if g.PackageName != "" {
args = append(args, "--additional-properties", core.Concat("packageName=", g.PackageName))
}
return args
}
// Available checks if openapi-generator-cli is installed.
// Uses App.Find which searches PATH without importing os/exec.
//
// r := gen.Available()
func (g *SDKGenerator) Available() bool {
r := core.App{}.Find("openapi-generator-cli", "OpenAPI Generator")
return r.OK
}
// SupportedLanguages returns the list of supported SDK target languages.
func SupportedLanguages() []string {
return slices.Sorted(maps.Keys(supportedLanguages))
}
// SupportedLanguagesIter returns an iterator over supported SDK target languages.
func SupportedLanguagesIter() iter.Seq[string] {
return slices.Values(SupportedLanguages())
}