Skip to content

Commit

Permalink
Example stringsvc updated to reflect gokit.io (#638)
Browse files Browse the repository at this point in the history
* Example/stringsvc1 updated file flow to mimic tutorial on gokit.io

Change the order of the code in the example/stringsvc1 so that it flows
with the tutorial on gokit.io

* Stringsvc1 is missing Context in StringService interface

StringService interface should have a Context in its service
definition. File does not match the tutorial on gokit.io
  • Loading branch information
wadearnold authored and peterbourgon committed Dec 7, 2017
1 parent 53f10af commit ebf82f4
Showing 1 changed file with 45 additions and 41 deletions.
86 changes: 45 additions & 41 deletions examples/stringsvc1/main.go
Expand Up @@ -14,47 +14,50 @@ import (

// StringService provides operations on strings.
type StringService interface {
Uppercase(string) (string, error)
Count(string) int
Uppercase(context.Context, string) (string, error)
Count(context.Context, string) int
}

// stringService is a concrete implementation of StringService
type stringService struct{}

func (stringService) Uppercase(s string) (string, error) {
func (stringService) Uppercase(_ context.Context, s string) (string, error) {
if s == "" {
return "", ErrEmpty
}
return strings.ToUpper(s), nil
}

func (stringService) Count(s string) int {
func (stringService) Count(_ context.Context, s string) int {
return len(s)
}

func main() {
svc := stringService{}
// ErrEmpty is returned when an input string is empty.
var ErrEmpty = errors.New("empty string")

uppercaseHandler := httptransport.NewServer(
makeUppercaseEndpoint(svc),
decodeUppercaseRequest,
encodeResponse,
)
// For each method, we define request and response structs
type uppercaseRequest struct {
S string `json:"s"`
}

countHandler := httptransport.NewServer(
makeCountEndpoint(svc),
decodeCountRequest,
encodeResponse,
)
type uppercaseResponse struct {
V string `json:"v"`
Err string `json:"err,omitempty"` // errors don't define JSON marshaling
}

http.Handle("/uppercase", uppercaseHandler)
http.Handle("/count", countHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
type countRequest struct {
S string `json:"s"`
}

type countResponse struct {
V int `json:"v"`
}

// Endpoints are a primary abstraction in go-kit. An endpoint represents a single RPC (method in our service interface)
func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(uppercaseRequest)
v, err := svc.Uppercase(req.S)
v, err := svc.Uppercase(ctx, req.S)
if err != nil {
return uppercaseResponse{v, err.Error()}, nil
}
Expand All @@ -65,11 +68,32 @@ func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint {
func makeCountEndpoint(svc StringService) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(countRequest)
v := svc.Count(req.S)
v := svc.Count(ctx, req.S)
return countResponse{v}, nil
}
}

// Transports expose the service to the network. In this first example we utilize JSON over HTTP.
func main() {
svc := stringService{}

uppercaseHandler := httptransport.NewServer(
makeUppercaseEndpoint(svc),
decodeUppercaseRequest,
encodeResponse,
)

countHandler := httptransport.NewServer(
makeCountEndpoint(svc),
decodeCountRequest,
encodeResponse,
)

http.Handle("/uppercase", uppercaseHandler)
http.Handle("/count", countHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}

func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) {
var request uppercaseRequest
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
Expand All @@ -89,23 +113,3 @@ func decodeCountRequest(_ context.Context, r *http.Request) (interface{}, error)
func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
return json.NewEncoder(w).Encode(response)
}

type uppercaseRequest struct {
S string `json:"s"`
}

type uppercaseResponse struct {
V string `json:"v"`
Err string `json:"err,omitempty"` // errors don't define JSON marshaling
}

type countRequest struct {
S string `json:"s"`
}

type countResponse struct {
V int `json:"v"`
}

// ErrEmpty is returned when an input string is empty.
var ErrEmpty = errors.New("empty string")

0 comments on commit ebf82f4

Please sign in to comment.