Skip to content

Instantly share code, notes, and snippets.

@soniah
Last active September 24, 2021 21:30
Show Gist options
  • Save soniah/3508017bdb6f7c617d474f5930327e49 to your computer and use it in GitHub Desktop.
Save soniah/3508017bdb6f7c617d474f5930327e49 to your computer and use it in GitHub Desktop.
golang builder pattern
package main
// tip of the hat to Jon Calhoun
//
// see also: https://www.calhoun.io/using-functional-options-instead-of-method-chaining-in-go/
import (
"errors"
"fmt"
"strings"
)
type FakeBuilder struct {
Result string
err error
}
func wrap(s string) string {
return "<" + strings.TrimSpace(s) + ">"
}
func (f *FakeBuilder) Append(val string) *FakeBuilder {
if f.err != nil {
return f
}
if val == "error" {
f.err = errors.New("invalid value")
}
f.Result = f.Result + wrap(val)
return f
}
func (f *FakeBuilder) Prepend(val string) *FakeBuilder {
if f.err != nil {
return f
}
f.Result = wrap(val) + f.Result
return f
}
func (f *FakeBuilder) Err() error {
return f.err
}
func main() {
var fb FakeBuilder
err := fb.Append(" hi ").Prepend("2021-09-23: ").Prepend(" does it do anything ").Append(" more ").Err()
if err != nil {
panic(err)
}
fmt.Println(fb.Result)
var fb2 FakeBuilder
err = fb2.Append("hi").Prepend("2021-09-23: ").Append("error").Prepend("does it do anything").Err()
if err != nil {
panic(err)
}
fmt.Println(fb2.Result)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment