package builder_test import ( "fmt" "github.com/lann/builder" ) // Simple math expression allowing multiple adds/subtracts and a single // (optional) multiply. type simpleExpr struct { Multiplier int Adds []int Subtracts []int } func (e simpleExpr) Equals() (total int) { for _, i := range e.Adds { total += i } for _, i := range e.Subtracts { total -= i } if e.Multiplier != 0 { total *= e.Multiplier } return } // Start builder definition type simpleExprBuilder builder.Builder func (b simpleExprBuilder) Multiplier(i int) simpleExprBuilder { return builder.Set(b, "Multiplier", i).(simpleExprBuilder) } func (b simpleExprBuilder) Add(i int) simpleExprBuilder { return builder.Append(b, "Adds", i).(simpleExprBuilder) } func (b simpleExprBuilder) Subtract(i int) simpleExprBuilder { return builder.Append(b, "Subtracts", i).(simpleExprBuilder) } func (b simpleExprBuilder) Equals() int { return builder.GetStruct(b).(simpleExpr).Equals() } // SimpleExprBuilder is an empty builder var SimpleExprBuilder = builder.Register(simpleExprBuilder{}, simpleExpr{}).(simpleExprBuilder) // End builder definition func Example_basic() { b := SimpleExprBuilder.Add(10).Subtract(3) // Intermediate values can be reused b2 := b.Multiplier(2) b3 := b.Multiplier(3) fmt.Println(b.Equals(), b2.Equals(), b3.Equals()) // Output: // 7 14 21 }