Skip to content

Instantly share code, notes, and snippets.

@theteachr
Last active June 2, 2024 10:58
Show Gist options
  • Save theteachr/4b33b7c2c5ce8f394e96524a69e7fa82 to your computer and use it in GitHub Desktop.
Save theteachr/4b33b7c2c5ce8f394e96524a69e7fa82 to your computer and use it in GitHub Desktop.
Type State Pattern in Go
package main
import (
"fmt"
"io"
"strings"
)
type Header struct {
Key string
Val string
}
type ResponseBuilder struct {
StatusCode int
Headers []Header
Body io.Reader
}
type Response ResponseBuilder
func (r *Response) Send() {
fmt.Printf("Sending response: %+v\n", *r)
}
type (
NewResponse interface {
Status(int) WithHeaders
}
WithHeaders interface {
AddHeader(k string, v string) WithHeaders
SetBody(io.Reader) WithHeaders
Build() *Response
}
)
func (r *ResponseBuilder) Status(code int) WithHeaders {
r.StatusCode = code
return r
}
func (r *ResponseBuilder) AddHeader(k string, v string) WithHeaders {
r.Headers = append(r.Headers, Header{k, v})
return r
}
func (r *ResponseBuilder) SetBody(body io.Reader) WithHeaders {
r.Body = body
return r
}
func (r *ResponseBuilder) Build() *Response {
response := Response(*r)
return &response
}
func main() {
var builder NewResponse = &ResponseBuilder{}
builder.
Status(200).
SetBody(strings.NewReader("asf")).
AddHeader("Content", "json").
AddHeader("Un", "").
Build().
Send()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment