feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
|
|
|
package generators
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"os"
|
|
|
|
|
"os/exec"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
|
|
coreio "forge.lthn.ai/core/go-io"
|
2026-03-16 21:03:21 +00:00
|
|
|
coreerr "forge.lthn.ai/core/go-log"
|
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// PHPGenerator generates PHP SDKs from OpenAPI specs.
|
|
|
|
|
type PHPGenerator struct{}
|
|
|
|
|
|
|
|
|
|
// NewPHPGenerator creates a new PHP generator.
|
|
|
|
|
func NewPHPGenerator() *PHPGenerator {
|
|
|
|
|
return &PHPGenerator{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Language returns the generator's target language identifier.
|
|
|
|
|
func (g *PHPGenerator) Language() string {
|
|
|
|
|
return "php"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Available checks if generator dependencies are installed.
|
|
|
|
|
func (g *PHPGenerator) Available() bool {
|
|
|
|
|
_, err := exec.LookPath("docker")
|
|
|
|
|
return err == nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Install returns instructions for installing the generator.
|
|
|
|
|
func (g *PHPGenerator) Install() string {
|
|
|
|
|
return "Docker is required for PHP SDK generation"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Generate creates SDK from OpenAPI spec.
|
|
|
|
|
func (g *PHPGenerator) Generate(ctx context.Context, opts Options) error {
|
|
|
|
|
if !g.Available() {
|
2026-03-16 21:03:21 +00:00
|
|
|
return coreerr.E("php.Generate", "Docker is required but not available", nil)
|
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := coreio.Local.EnsureDir(opts.OutputDir); err != nil {
|
2026-03-16 21:03:21 +00:00
|
|
|
return coreerr.E("php.Generate", "failed to create output dir", err)
|
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
specDir := filepath.Dir(opts.SpecPath)
|
|
|
|
|
specName := filepath.Base(opts.SpecPath)
|
|
|
|
|
|
|
|
|
|
args := []string{"run", "--rm"}
|
|
|
|
|
args = append(args, dockerUserArgs()...)
|
|
|
|
|
args = append(args,
|
|
|
|
|
"-v", specDir+":/spec",
|
|
|
|
|
"-v", opts.OutputDir+":/out",
|
|
|
|
|
"openapitools/openapi-generator-cli", "generate",
|
|
|
|
|
"-i", "/spec/"+specName,
|
|
|
|
|
"-g", "php",
|
|
|
|
|
"-o", "/out",
|
|
|
|
|
"--additional-properties=invokerPackage="+opts.PackageName,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
cmd := exec.CommandContext(ctx, "docker", args...)
|
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
|
|
|
|
|
|
if err := cmd.Run(); err != nil {
|
2026-03-16 21:03:21 +00:00
|
|
|
return coreerr.E("php.Generate", "docker run failed", err)
|
feat: extract build/, release/, sdk/ from go-devops
Build system (8 builders, signing, archiving), release pipeline
(7 publishers, versioning, changelog), and SDK generation
(OpenAPI diff, code gen). 18K LOC, all tests pass except Go
builder workspace isolation (pre-existing).
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-09 12:37:36 +00:00
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|