Skip to content

Instantly share code, notes, and snippets.

@rmueller
Created January 2, 2018 12:32
Show Gist options
  • Save rmueller/896ab99c168a10c49f2d4adfbf208646 to your computer and use it in GitHub Desktop.
Save rmueller/896ab99c168a10c49f2d4adfbf208646 to your computer and use it in GitHub Desktop.
package main
import "fmt"
type MessageBuilder interface {
WithOwner(string) MessageBuilder
WithWebinar(string) MessageBuilder
WithViewer(string, string) MessageBuilder
Build() *Message
}
type messageBuilder struct {
message *Message
}
func (m *messageBuilder) WithOwner(email string) MessageBuilder {
m.message.owner = Owner{email}
return m
}
func (m *messageBuilder) WithViewer(email string, language string) MessageBuilder {
m.message.viewer = Viewer{email,language}
return m
}
func (m *messageBuilder) WithWebinar(cover_url string) MessageBuilder {
m.message.webinar = Webinar{cover_url}
return m
}
func (m *messageBuilder) Build() *Message {
return m.message
}
func NewMessageBuider(eventId string) MessageBuilder{
message := &Message{event_id:eventId}
return &messageBuilder{message}
}
type Webinar struct {
coverl_url string
}
type Owner struct {
email string
}
type Message struct {
event_id string
viewer Viewer
webinar Webinar
owner Owner
}
type Viewer struct {
email string
language string
}
func main() {
builder := NewMessageBuider("webinar_started")
oneMessage := builder.WithOwner("owner").Build()
anotherBuilder := NewMessageBuider("webinar_canceled")
anotherMessage := anotherBuilder.WithOwner("owner").WithViewer("email","language").Build()
fmt.Println(oneMessage)
fmt.Println(anotherMessage)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment