Fluent immutable builders for golang
Switch branches/tags
Clone or download
lann Merge pull request #10 from lann/registry-mux
Wrap registry map access in RWMutex
Latest commit 47ae307 Aug 2, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore Initial commit Jan 17, 2014
.travis.yml Update .travis.yml Aug 2, 2018
LICENSE Create LICENSE Feb 16, 2018
README.md Update README.md Jan 28, 2014
builder.go
builder_test.go Allow setting nil on appropriate fields Aug 29, 2014
example_test.go Tweak example Jan 19, 2014
reflect.go
registry.go Wrap registry map access in RWMutex Aug 2, 2018

README.md

Builder - fluent immutable builders for Go

GoDoc Build Status

Builder was originally written for Squirrel, a fluent SQL generator. It is probably the best example of Builder in action.

Builder helps you write fluent DSLs for your libraries with method chaining:

resp := ReqBuilder.
    Url("http://golang.org").
    Header("User-Agent", "Builder").
    Get()

Builder uses immutable persistent data structures (these, specifically) so that each step in your method chain can be reused:

build := WordBuilder.AddLetters("Build")
builder := build.AddLetters("er")
building := build.AddLetters("ing")

Builder makes it easy to build structs using the builder pattern (surprise!):

import "github.com/lann/builder"

type Muppet struct {
    Name string
    Friends []string
}

type muppetBuilder builder.Builder

func (b muppetBuilder) Name(name string) muppetBuilder {
    return builder.Set(b, "Name", name).(muppetBuilder)
}

func (b muppetBuilder) AddFriend(friend string) muppetBuilder {
    return builder.Append(b, "Friends", friend).(muppetBuilder)
}

func (b muppetBuilder) Build() Muppet {
    return builder.GetStruct(b).(Muppet)
}

var MuppetBuilder = builder.Register(muppetBuilder{}, Muppet{}).(muppetBuilder)
MuppetBuilder.
    Name("Beaker").
    AddFriend("Dr. Honeydew").
    Build()

=> Muppet{Name:"Beaker", Friends:[]string{"Dr. Honeydew"}}

License

Builder is released under the MIT License.