From 76861edb88efded2f24aade14f2c64c45e4a977c Mon Sep 17 00:00:00 2001 From: Asim Date: Wed, 2 Dec 2015 23:05:52 +0000 Subject: [PATCH] Add readme --- examples/client/codegen/README.md | 137 ++++++++++++++++++++ examples/server/proto/example/example.pb.go | 4 +- 2 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 examples/client/codegen/README.md diff --git a/examples/client/codegen/README.md b/examples/client/codegen/README.md new file mode 100644 index 00000000..c66650d8 --- /dev/null +++ b/examples/client/codegen/README.md @@ -0,0 +1,137 @@ +# Code Generation [Experimental] + +We're experimenting with code generation to reduce the amount of boiler plate code written. + +## Example + +Going from this +```golang +req := client.NewRequest("go.micro.srv.example", "Example.Call", &example.Request{ + Name: "John", +}) + +rsp := &example.Response{} + +if err := client.Call(context.Background(), req, rsp); err != nil { + return err +} +``` + +To + +```golang +rsp, err := cl.Call(context.Background(), &example.Request{Name: "John"}) +if err != nil { + return err +} +``` + +## Generation of stub code for the example service + +```shell +go get github.com/micro/protobuf/protoc-gen-go +cd examples/server/proto/example +protoc --go_out=plugins=micro:. example.proto +``` + +Look at examples/server/proto/example/examples/server/proto/example/example.pb.go +to see the generated code. + +## Guide + +### Download the protoc-gen-go code + +```shell +go get github.com/micro/protobuf/protoc-gen-go +``` + +### Define your proto service. + +greeter.proto +```shell +syntax = "proto3"; + +package go.micro.srv.greeter; + +service Say { + rpc Hello(Request) returns (Response) {} +} + +message Request { + optional string name = 1; +} + +message Response { + optional string msg = 1; +} +``` + +### Generate code + +```shell +protoc --go_out=plugins=micro:. hello.proto +``` + +### Generated code + +```shell +// Client API for Say service + +type SayClient interface { + Hello(ctx context.Context, in *Request) (*Response, error) +} + +type sayClient struct { + c client.Client +} + +func NewSayClient(c client.Client) SayClient { + if c == nil { + c = client.NewClient() + } + return &sayClient{ + c: c, + } +} + +func (c *sayClient) Hello(ctx context.Context, in *Request) (*Response, error) { + req := c.c.NewRequest("go.micro.srv.greeter", "Say.Hello", in) + out := new(Response) + err := c.c.Call(ctx, req, out) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Say service + +type SayServer interface { + Hello(context.Context, *Request, *Response) error +} + +func RegisterSayServer(s server.Server, srv SayServer) { + s.Handle(s.NewHandler(srv)) +} +``` + +### Use the client +```golang + +import ( + "fmt" + + "golang.org/x/net/context" + "github.com/micro/go-micro/client" + hello "path/to/hello/proto" +) + +func main() { + cl := hello.NewSayClient(client.DefaultClient) + + rsp, err := cl.Hello(contex.Background(), &hello.Request{"Name": "John"}) + if err != nil { + fmt.Println(err) + } +} +``` diff --git a/examples/server/proto/example/example.pb.go b/examples/server/proto/example/example.pb.go index d7c10258..74df78f8 100644 --- a/examples/server/proto/example/example.pb.go +++ b/examples/server/proto/example/example.pb.go @@ -151,8 +151,8 @@ func (x *exampleStreamClient) Next() (*StreamingResponse, error) { // Server API for Example service type ExampleServer interface { - Call(context.Context, *Request) (*Response, error) - Stream(context.Context, *StreamingRequest, func(*StreamingResponse) error) error + Call(context.Context, *Request, *Response) error + Stream(context.Context, func(*StreamingResponse) error) error } func RegisterExampleServer(s server.Server, srv ExampleServer) {