Codegen Mode¶
Codegen mode generates typed Go code from your OpenAPI specs, giving you compiled services with custom middleware, typed request/response handlers, and a single binary you can deploy anywhere.
Use codegen mode when you need more than what Portable Mode offers - custom business logic, authentication middleware, request validation, or a self-contained binary.
Quick Start¶
Generate a service from the Petstore spec:
mkdir myapp && cd myapp
go mod init myapp
go run github.com/mockzilla/connexions/v2/cmd/gen/service@latest \
-name petstore \
https://petstore3.swagger.io/api/v3/openapi.json
Add the dependency and generate the code:
go get github.com/mockzilla/connexions/v2@latest
go mod tidy
go generate ./...
Create main.go:
package main
import (
"log"
"net/http"
"github.com/mockzilla/connexions/v2/pkg/api"
"github.com/mockzilla/connexions/v2/pkg/loader"
_ "myapp/petstore"
)
func main() {
router := api.NewRouter()
loader.LoadAll(router)
log.Println("Starting server on :2200")
log.Fatal(http.ListenAndServe(":2200", router))
}
Run it:
go run main.go
How It Works¶
- Generate - the
gen/servicecommand reads your OpenAPI spec and produces Go code - Customize - edit
service.goandmiddleware.go(never overwritten on regeneration) - Build - compile into a single binary with
go build - Deploy - ship the binary anywhere, no runtime dependencies
Generated Structure¶
petstore/
├── generate.go # go generate directive for regeneration
├── gen.go # Generated types, handlers, registration (do not edit)
├── service.go # Your business logic (edit this)
├── middleware.go # Custom middleware (edit this, enable in codegen.yml)
└── setup/
├── codegen.yml # Code generation settings
├── config.yml # Service runtime config
├── context.yml # Context values for response generation
└── openapi.json # OpenAPI spec
service.go and middleware.go are generated once and never overwritten. gen.go regenerates with go generate.
Enabling Middleware¶
To get middleware.go generated, uncomment the middleware line in setup/codegen.yml:
generate:
handler:
service: {}
middleware: {} # uncomment this line
Then regenerate:
go generate ./...
Customizing Handlers¶
Each operation gets a method in service.go. Return nil, nil to use the auto-generated mock response, or return your own:
func (s *service) GetPetByID(ctx context.Context, opts *GetPetByIDServiceRequestOptions) (*GetPetByIDResponseData, error) {
// Use the generator as a starting point
resp, err := opts.GenerateResponse()
if err != nil {
return nil, err
}
// Override specific fields
resp.Body.ID = opts.PathParams.PetId
resp.Body.Name = "Custom Pet"
return resp, nil
}
Custom Middleware¶
Edit middleware.go to add authentication, logging, or request modification. See Custom Middleware for details and examples.
Multiple Services¶
Generate each service, then import them all in a single main.go:
go run github.com/mockzilla/connexions/v2/cmd/gen/service@latest -name petstore ./petstore.yml
go run github.com/mockzilla/connexions/v2/cmd/gen/service@latest -name payments ./payments.yml
go generate ./...
package main
import (
"log"
"net/http"
"github.com/mockzilla/connexions/v2/pkg/api"
"github.com/mockzilla/connexions/v2/pkg/loader"
_ "myapp/petstore"
_ "myapp/payments"
)
func main() {
router := api.NewRouter()
loader.LoadAll(router)
log.Println("Starting server on :2200")
log.Fatal(http.ListenAndServe(":2200", router))
}
Each service registers itself via init() when imported.
Regeneration¶
After changing the OpenAPI spec or codegen settings, regenerate:
go generate ./...
This regenerates gen.go. Your service.go and middleware.go are preserved.
Service Configuration¶
Each service has a setup/config.yml for runtime behavior. See Service Config for all options:
latency: 100ms
errors:
p5: 500
upstream:
url: https://api.example.com
cache:
requests: true
Code Generation Settings¶
Control what gets generated via setup/codegen.yml. See Codegen Config for details.
Learn More¶
- Service Config - latency, errors, upstream proxy, caching, replay
- Codegen Config - code generation settings
- Custom Middleware - authentication, logging, request modification
- Contexts - control generated values with fake data, patterns, aliases
- Replay - record and replay API responses
- Factory - use the generation engine programmatically from Go
- Service Command - full reference for
gen/service
Template¶
Start from a GitHub template with CI/CD, API Explorer UI, and example services ready to go:
See Templates for all available templates.
When to Use Codegen Mode¶
| Need | Use |
|---|---|
| Quick prototyping, testing | Portable Mode |
| Custom auth, business logic | Codegen Mode |
| Single deployable binary | Codegen Mode |
| Typed request/response handling | Codegen Mode |
| CI/CD mock server | Either |