go-devops/sdk/generators/generator.go

91 lines
2.2 KiB
Go
Raw Permalink Normal View History

// Package generators provides SDK code generators for different languages.
package generators
import (
"context"
"fmt"
"iter"
"maps"
"os"
"runtime"
"slices"
)
// Options holds common generation options.
type Options struct {
// SpecPath is the path to the OpenAPI spec file.
SpecPath string
// OutputDir is where to write the generated SDK.
OutputDir string
// PackageName is the package/module name.
PackageName string
// Version is the SDK version.
Version string
}
// Generator defines the interface for SDK generators.
type Generator interface {
// Language returns the generator's target language identifier.
Language() string
// Generate creates SDK from OpenAPI spec.
Generate(ctx context.Context, opts Options) error
// Available checks if generator dependencies are installed.
Available() bool
// Install returns instructions for installing the generator.
Install() string
}
// Registry holds available generators.
type Registry struct {
generators map[string]Generator
}
// NewRegistry creates a registry with all available generators.
func NewRegistry() *Registry {
r := &Registry{
generators: make(map[string]Generator),
}
// Generators will be registered in subsequent tasks
return r
}
// Get returns a generator by language.
func (r *Registry) Get(lang string) (Generator, bool) {
g, ok := r.generators[lang]
return g, ok
}
// Register adds a generator to the registry.
func (r *Registry) Register(g Generator) {
r.generators[g.Language()] = g
}
// Languages returns all registered language identifiers.
func (r *Registry) Languages() []string {
return slices.Collect(r.LanguagesIter())
}
// LanguagesIter returns an iterator for all registered language identifiers.
func (r *Registry) LanguagesIter() iter.Seq[string] {
return func(yield func(string) bool) {
// Sort keys for deterministic iteration
for _, lang := range slices.Sorted(maps.Keys(r.generators)) {
if !yield(lang) {
return
}
}
}
}
// dockerUserArgs returns Docker --user args for the current user on Unix systems.
// On Windows, Docker handles permissions differently, so no args are returned.
func dockerUserArgs() []string {
if runtime.GOOS == "windows" {
return nil
}
return []string{"--user", fmt.Sprintf("%d:%d", os.Getuid(), os.Getgid())}
}