First let's set up a golang module
module github.com/gen/project
go 1.24using the minimum configuration
// file: chainer.pkl
amends "package://nhatp.com/go/chainer-gen/pkl@0.3.0#/Config.pkl"
import "package://nhatp.com/go/chainer-gen/pkl@0.3.0#/match.pkl"
packages {
["github.com/gen/project"] {
struct_name = match.with("createUserOp")
}
}source code
// file: main.go
package main
import "context"
type CreateUserInput struct{}
type createUserOp struct {
}
func (op *createUserOp) validate(ctx context.Context, input CreateUserInput) error {
return nil
}
func (op *createUserOp) authorize(ctx context.Context, input CreateUserInput) error {
return nil
}
func (op *createUserOp) handle(ctx context.Context, input CreateUserInput) error {
return nil
}expected generated code
// golden-file: gen_chainer.go
// Code generated by go-chainer-gen - dev. DO NOT EDIT.
package main
import (
"context"
"fmt"
)
// execute runs createUserOp.validate, createUserOp.authorize, and
// createUserOp.handle in sequence.
func (op *createUserOp) execute(ctx context.Context, input CreateUserInput) error {
v0 := op.validate(ctx, input)
if v0 != nil {
return fmt.Errorf("validate: %w", v0)
}
v1 := op.authorize(ctx, input)
if v1 != nil {
return fmt.Errorf("authorize: %w", v1)
}
v2 := op.handle(ctx, input)
if v2 != nil {
return fmt.Errorf("handle: %w", v2)
}
return nil
}source code
// file: main.go
package main
import "context"
type CreateUserInput struct{}
type createUserOp struct {
}
func (op *createUserOp) authorize(ctx context.Context, input CreateUserInput) error {
return nil
}
func (op *createUserOp) handle(ctx context.Context, input CreateUserInput) error {
return nil
}expected generated code
// golden-file: gen_chainer.go
// Code generated by go-chainer-gen - dev. DO NOT EDIT.
package main
import (
"context"
"fmt"
)
// execute runs createUserOp.authorize, and createUserOp.handle in sequence.
func (op *createUserOp) execute(ctx context.Context, input CreateUserInput) error {
v0 := op.authorize(ctx, input)
if v0 != nil {
return fmt.Errorf("authorize: %w", v0)
}
v1 := op.handle(ctx, input)
if v1 != nil {
return fmt.Errorf("handle: %w", v1)
}
return nil
}source code
// file: main.go
package main
import "context"
type CreateUserInput struct{}
type createUserOp struct {
}
func (op *createUserOp) validate(ctx context.Context, input CreateUserInput) error {
return nil
}
func (op *createUserOp) authorize(ctx context.Context) error {
return nil
}
func (op *createUserOp) handle(ctx context.Context, input CreateUserInput) error {
return nil
}expected generated code
// golden-file: gen_chainer.go
// Code generated by go-chainer-gen - dev. DO NOT EDIT.
package main
import (
"context"
"fmt"
)
// execute runs createUserOp.validate, createUserOp.authorize, and
// createUserOp.handle in sequence.
func (op *createUserOp) execute(ctx context.Context, input CreateUserInput) error {
v0 := op.validate(ctx, input)
if v0 != nil {
return fmt.Errorf("validate: %w", v0)
}
v1 := op.authorize(ctx)
if v1 != nil {
return fmt.Errorf("authorize: %w", v1)
}
v2 := op.handle(ctx, input)
if v2 != nil {
return fmt.Errorf("handle: %w", v2)
}
return nil
}source code
// file: main.go
package main
import "context"
type CreateUserInput struct{}
type createUserOp struct {
}
func (op *createUserOp) validate(ctx context.Context, input CreateUserInput) error {
return nil
}
func (op *createUserOp) authorize(ctx context.Context, input CreateUserInput) (string, error) {
return "handoff", nil
}
func (op *createUserOp) handle(ctx context.Context, input CreateUserInput, fromAuthz string) error {
return nil
}expected generated code
// golden-file: gen_chainer.go
// Code generated by go-chainer-gen - dev. DO NOT EDIT.
package main
import (
"context"
"fmt"
)
// execute runs createUserOp.validate, createUserOp.authorize, and
// createUserOp.handle in sequence.
func (op *createUserOp) execute(ctx context.Context, input CreateUserInput) error {
v0 := op.validate(ctx, input)
if v0 != nil {
return fmt.Errorf("validate: %w", v0)
}
v1, v2 := op.authorize(ctx, input)
if v2 != nil {
return fmt.Errorf("authorize: %w", v2)
}
v3 := op.handle(ctx, input, v1)
if v3 != nil {
return fmt.Errorf("handle: %w", v3)
}
return nil
}source code
// file: main.go
package main
import "context"
type CreateUserInput struct{}
type createUserOp struct {
}
func (op *createUserOp) validate(ctx context.Context, input CreateUserInput) (int, error) {
return 0, nil
}
func (op *createUserOp) authorize(ctx context.Context, id int) (string, error) {
return "", nil
}
func (op *createUserOp) handle(ctx context.Context, input CreateUserInput, fromAuthz string) error {
return nil
}expected generated code
// golden-file: gen_chainer.go
// Code generated by go-chainer-gen - dev. DO NOT EDIT.
package main
import (
"context"
"fmt"
)
// execute runs createUserOp.validate, createUserOp.authorize, and
// createUserOp.handle in sequence.
func (op *createUserOp) execute(ctx context.Context, input CreateUserInput) error {
v0, v1 := op.validate(ctx, input)
if v1 != nil {
return fmt.Errorf("validate: %w", v1)
}
v2, v3 := op.authorize(ctx, v0)
if v3 != nil {
return fmt.Errorf("authorize: %w", v3)
}
v4 := op.handle(ctx, input, v2)
if v4 != nil {
return fmt.Errorf("handle: %w", v4)
}
return nil
}source code
// file: main.go
package main
import "context"
type CreateUserInput struct{}
type createUserOp struct {
}
func (op *createUserOp) validate(ctx context.Context, input CreateUserInput) (int, error) {
return 0, nil
}
func (op *createUserOp) authorize(ctx context.Context, id int) (string, error) {
return "", nil
}
func (op *createUserOp) handle(ctx context.Context, input CreateUserInput) error {
return nil
}expected generated code
// golden-file: gen_chainer.go
// Code generated by go-chainer-gen - dev. DO NOT EDIT.
package main
import (
"context"
"fmt"
)
// execute runs createUserOp.validate, createUserOp.authorize, and
// createUserOp.handle in sequence.
func (op *createUserOp) execute(ctx context.Context, input CreateUserInput) error {
v0, v1 := op.validate(ctx, input)
if v1 != nil {
return fmt.Errorf("validate: %w", v1)
}
_, v3 := op.authorize(ctx, v0)
if v3 != nil {
return fmt.Errorf("authorize: %w", v3)
}
v4 := op.handle(ctx, input)
if v4 != nil {
return fmt.Errorf("handle: %w", v4)
}
return nil
}source code
// file: main.go
package main
import "context"
type CreateUserInput struct{}
type CreateUserResult struct{}
type createUserOp struct {
}
func (op *createUserOp) validate(ctx context.Context, input CreateUserInput) (int, error) {
return 0, nil
}
func (op *createUserOp) authorize(id int) (string, error) {
return "", nil
}
func (op *createUserOp) handle(ctx context.Context, input CreateUserInput) (CreateUserResult, error) {
return CreateUserResult{}, nil
}expected generated code
// golden-file: gen_chainer.go
// Code generated by go-chainer-gen - dev. DO NOT EDIT.
package main
import (
"context"
"fmt"
)
// execute runs createUserOp.validate, createUserOp.authorize, and
// createUserOp.handle in sequence.
func (op *createUserOp) execute(ctx context.Context, input CreateUserInput) (CreateUserResult, error) {
v0, v1 := op.validate(ctx, input)
if v1 != nil {
return CreateUserResult{}, fmt.Errorf("validate: %w", v1)
}
_, v3 := op.authorize(v0)
if v3 != nil {
return CreateUserResult{}, fmt.Errorf("authorize: %w", v3)
}
v4, v5 := op.handle(ctx, input)
if v5 != nil {
return CreateUserResult{}, fmt.Errorf("handle: %w", v5)
}
return v4, nil
}