Builder#

Writing test fixtures by hand means repeating the same struct literal everywhere, and editing every call site whenever a field is added. The Builder generator gives you a fluent With...() API instead. Enabled by default; disable with -builder=false.

gcraft generate -type User -src ./user.go
type User struct {
	Name  string
	Email string
	Age   int
}

Generates:

type UserBuilder struct {
	v User
}

func NewUserBuilder() *UserBuilder {
	return &UserBuilder{}
}

func (b *UserBuilder) WithName(v string) *UserBuilder {
	b.v.Name = v
	return b
}

func (b *UserBuilder) WithEmail(v string) *UserBuilder {
	b.v.Email = v
	return b
}

func (b *UserBuilder) WithAge(v int) *UserBuilder {
	b.v.Age = v
	return b
}

func (b *UserBuilder) Build() User {
	return b.v
}

Usage:

u := NewUserBuilder().
	WithName("Ada").
	WithEmail("ada@example.com").
	WithAge(30).
	Build()

Build() returns User by value, not a pointer.