mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 19:04:35 +00:00
Moving cruftier services that are only used for tests under a test repo
This commit is contained in:
3
test/blob-store/README.md
Normal file
3
test/blob-store/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Blob Store
|
||||
|
||||
A service which demonstrates how to read and write from the blob store
|
||||
41
test/blob-store/main.go
Normal file
41
test/blob-store/main.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
"github.com/micro/micro/v3/service/store"
|
||||
)
|
||||
|
||||
func main() {
|
||||
service.New(
|
||||
service.Name("blob-store"),
|
||||
service.Version("latest"),
|
||||
)
|
||||
|
||||
key := uuid.New().String()
|
||||
|
||||
buf := bytes.NewBuffer([]byte("world"))
|
||||
if err := store.DefaultBlobStore.Write(key, buf); err != nil {
|
||||
logger.Fatalf("Error writing to blob store: %v", err)
|
||||
} else {
|
||||
logger.Infof("Write okay")
|
||||
}
|
||||
|
||||
res, err := store.DefaultBlobStore.Read(key)
|
||||
if err != nil {
|
||||
logger.Fatalf("Error reading from the blog store: %v", err)
|
||||
}
|
||||
bytes, err := ioutil.ReadAll(res)
|
||||
if err != nil {
|
||||
logger.Fatalf("Error reading result: %v", err)
|
||||
}
|
||||
logger.Infof("Read from blob store: %v", string(bytes))
|
||||
|
||||
if err := store.DefaultBlobStore.Delete(key); err != nil {
|
||||
logger.Fatalf("Error deleting from blob store: %v", err)
|
||||
}
|
||||
}
|
||||
3
test/conf/README.md
Normal file
3
test/conf/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Conf
|
||||
|
||||
A service which demonstrates how to read and write config
|
||||
59
test/conf/main.go
Normal file
59
test/conf/main.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/config"
|
||||
)
|
||||
|
||||
type keyConfig struct {
|
||||
Subkey string `json:"subkey"`
|
||||
Subkey1 int `json:"subkey1"`
|
||||
Subkey2 string `json:"subkey2"`
|
||||
}
|
||||
|
||||
type conf struct {
|
||||
Key keyConfig `json:"key"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
// get a value
|
||||
go func() {
|
||||
for {
|
||||
time.Sleep(time.Second)
|
||||
// Test merge
|
||||
err := config.Set("key", map[string]interface{}{
|
||||
"Subkey3": "Merge",
|
||||
})
|
||||
if err != nil {
|
||||
fmt.Println("ERROR: ", err)
|
||||
}
|
||||
|
||||
val, _ := config.Get("key.subkey3")
|
||||
if val.String("") != "Merge" {
|
||||
fmt.Println("ERROR: key.subkey3 should be 'Merge' but it is:", val.String(""))
|
||||
}
|
||||
|
||||
val, err = config.Get("key.subkey")
|
||||
fmt.Println("Value of key.subkey: ", val.String(""), err)
|
||||
|
||||
val, _ = config.Get("key", config.Secret(true))
|
||||
c := conf{}
|
||||
err = val.Scan(&c.Key)
|
||||
fmt.Println("Value of key.subkey1: ", c.Key.Subkey1, err)
|
||||
fmt.Println("Value of key.subkey2: ", c.Key.Subkey2)
|
||||
|
||||
val, _ = config.Get("key.subkey3")
|
||||
fmt.Println("Value of key.subkey3: ", val.String(""))
|
||||
|
||||
// Test defaults
|
||||
val, _ = config.Get("key.subkey_does_not_exist")
|
||||
fmt.Println("Default", val.String("Hello"))
|
||||
}
|
||||
}()
|
||||
|
||||
// run the service
|
||||
service.Run()
|
||||
}
|
||||
3
test/events/README.md
Normal file
3
test/events/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Events
|
||||
|
||||
A service which demonstrates how to read and write events
|
||||
154
test/events/main.go
Normal file
154
test/events/main.go
Normal file
@@ -0,0 +1,154 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/events"
|
||||
goevents "github.com/micro/micro/v3/service/events"
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
)
|
||||
|
||||
type testPayload struct {
|
||||
Message string
|
||||
}
|
||||
|
||||
var (
|
||||
payload = testPayload{Message: "HelloWorld"}
|
||||
metadata = map[string]string{"foo": "bar"}
|
||||
)
|
||||
|
||||
func main() {
|
||||
srv := service.New()
|
||||
srv.Init()
|
||||
|
||||
go func() { // test 1, ordinary sub with autoack
|
||||
evChan, err := events.Subscribe("test1")
|
||||
if err != nil {
|
||||
logger.Fatalf("Error creating subscriber: %v", err)
|
||||
}
|
||||
// Is there a race condition here with publish coming straight after subscribe? Seems to be according to this
|
||||
// test so sleep for a bit to wait for nats to register subscription properly
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
logger.Infof("TEST1: publishing event")
|
||||
|
||||
err = events.Publish("test1", payload, goevents.WithMetadata(metadata))
|
||||
if err != nil {
|
||||
logger.Errorf("TEST1: Error publishing event: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
logger.Infof("TEST1: waiting for event")
|
||||
event, ok := <-evChan
|
||||
if !ok {
|
||||
logger.Error("TEST1: Channel closed")
|
||||
return
|
||||
}
|
||||
|
||||
if event.Topic != "test1" {
|
||||
logger.Errorf("TEST1: Incorrect topic: %v", event.Topic)
|
||||
return
|
||||
}
|
||||
if event.Metadata == nil || event.Metadata["foo"] != metadata["foo"] {
|
||||
logger.Errorf("TEST1: Incorrect metadata: %v", event.Metadata)
|
||||
return
|
||||
}
|
||||
|
||||
var result testPayload
|
||||
if err := event.Unmarshal(&result); err != nil {
|
||||
logger.Errorf("TEST1: Error decoding result: %v. Payload was %v", err, string(event.Payload))
|
||||
return
|
||||
}
|
||||
if result.Message != payload.Message {
|
||||
logger.Errorf("TEST1: Incorrect message: %v", result.Message)
|
||||
return
|
||||
}
|
||||
|
||||
logger.Infof("TEST1: Finished ok")
|
||||
|
||||
}()
|
||||
|
||||
go func() { // test 2, sub with manual ack
|
||||
evChan, err := events.Subscribe("test2", goevents.WithAutoAck(false, 5*time.Second))
|
||||
if err != nil {
|
||||
logger.Errorf("TEST2: Error creating subscriber: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Is there a race condition here with publish coming straight after subscribe? Seems to be according to this
|
||||
// test so sleep for a bit to wait for nats to register subscription properly
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
logger.Infof("TEST2: publishing event")
|
||||
err = events.Publish("test2", payload, goevents.WithMetadata(metadata))
|
||||
|
||||
if err != nil {
|
||||
logger.Errorf("TEST2: Error publishing event: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
logger.Infof("TEST2: waiting for event")
|
||||
event, ok := <-evChan
|
||||
if !ok {
|
||||
logger.Errorf("TEST2: Channel closed")
|
||||
return
|
||||
}
|
||||
|
||||
if event.Topic != "test2" {
|
||||
logger.Errorf("TEST2: Incorrect topic: %v", event.Topic)
|
||||
return
|
||||
}
|
||||
if event.Metadata == nil || event.Metadata["foo"] != metadata["foo"] {
|
||||
logger.Errorf("TEST2: Incorrect metadata: %v", event.Metadata)
|
||||
return
|
||||
}
|
||||
|
||||
var result testPayload
|
||||
if err := event.Unmarshal(&result); err != nil {
|
||||
logger.Errorf("TEST2: Error decoding result: %v. Payload was %v", err, string(event.Payload))
|
||||
return
|
||||
}
|
||||
if result.Message != payload.Message {
|
||||
logger.Errorf("TEST2: Incorrect message: %v", result.Message)
|
||||
return
|
||||
}
|
||||
id := event.ID
|
||||
// nack the event to put it back on the queue
|
||||
logger.Infof("TEST2: Nacking the event")
|
||||
event.Nack()
|
||||
|
||||
logger.Infof("TEST2: waiting for event")
|
||||
select {
|
||||
case event := <-evChan:
|
||||
if event.ID != id {
|
||||
logger.Errorf("Unexpected event received, expected %s, received %s", id, event.ID)
|
||||
return
|
||||
}
|
||||
logger.Infof("TEST2: Acking the event")
|
||||
event.Ack()
|
||||
|
||||
case <-time.After(10 * time.Second):
|
||||
logger.Errorf("Timed out waiting for event")
|
||||
return
|
||||
}
|
||||
|
||||
// we've acked so should receive nothing else
|
||||
logger.Infof("TEST2: Waiting for timeout")
|
||||
select {
|
||||
case event := <-evChan:
|
||||
logger.Errorf("Unexpected event received %s", event.ID)
|
||||
return
|
||||
case <-time.After(10 * time.Second):
|
||||
|
||||
}
|
||||
|
||||
logger.Infof("TEST2: Finished ok")
|
||||
|
||||
}()
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
// wait indefinitely so this only runs once
|
||||
wg.Wait()
|
||||
}
|
||||
3
test/kv/README.md
Normal file
3
test/kv/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# KV
|
||||
|
||||
A service which demonstrates how to use the key-value store
|
||||
134
test/kv/handler/handler.go
Normal file
134
test/kv/handler/handler.go
Normal file
@@ -0,0 +1,134 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
log "github.com/micro/go-micro/v3/logger"
|
||||
store "github.com/micro/micro/v3/service/store"
|
||||
|
||||
pb "github.com/micro/services/kv/proto"
|
||||
)
|
||||
|
||||
type Example struct{}
|
||||
|
||||
// TestExpiry tests writing a record with expiry
|
||||
func (e *Example) TestExpiry(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
|
||||
if err := writeWithExpiry("WriteExpiry", "bar", 5*time.Second); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
recs, err := store.Read("WriteExpiry")
|
||||
if err != nil {
|
||||
log.Errorf("Error reading %s", err)
|
||||
return fmt.Errorf("Error reading record WriteExpiry with expiry %s", err)
|
||||
}
|
||||
if len(recs) != 1 {
|
||||
return fmt.Errorf("Error reading record WriteExpiry, expected 1 record. Received %d", len(recs))
|
||||
}
|
||||
|
||||
if err := writeWithExpiry("Record.Expiry", "bar", 5*time.Second); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
recs, err = store.Read("Record.Expiry")
|
||||
if err != nil {
|
||||
log.Errorf("Error reading %s", err)
|
||||
return fmt.Errorf("Error reading record Record.Expiry with expiry %s", err)
|
||||
}
|
||||
if len(recs) != 1 {
|
||||
return fmt.Errorf("Error reading record Record.Expiry, expected 1 record. Received %d", len(recs))
|
||||
}
|
||||
|
||||
if err := writeWithExpiry("WriteTTL", "bar", 5*time.Second); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
recs, err = store.Read("WriteTTL")
|
||||
if err != nil {
|
||||
log.Errorf("Error reading %s", err)
|
||||
return fmt.Errorf("Error reading record WriteTTL with expiry %s", err)
|
||||
}
|
||||
if len(recs) != 1 {
|
||||
return fmt.Errorf("Error reading record WriteTTL, expected 1 record. Received %d", len(recs))
|
||||
}
|
||||
|
||||
time.Sleep(6 * time.Second)
|
||||
recs, err = store.Read("Record.Expiry")
|
||||
if err != store.ErrNotFound {
|
||||
log.Errorf("Error reading %s", err)
|
||||
return fmt.Errorf("Error reading record Record.Expiry. Expected not found. Received %s and %d records", err, len(recs))
|
||||
}
|
||||
|
||||
rsp.Msg = "Success"
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeWithExpiry(key, val string, duration time.Duration) error {
|
||||
if err := store.Write(&store.Record{Key: key, Value: []byte(val), Expiry: duration}); err != nil {
|
||||
log.Errorf("Error writing %s", err)
|
||||
return fmt.Errorf("Error writing record %s with expiry %s", key, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *Example) TestList(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
|
||||
// Test Limit()
|
||||
for i := 0; i < 3; i++ {
|
||||
if err := writeWithExpiry(fmt.Sprintf("TestList%d", i), "bar", 5*time.Second); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
recs, err := store.List(store.Prefix("TestList"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error listing from store %s", err)
|
||||
}
|
||||
log.Infof("Recs %+v", recs)
|
||||
if len(recs) != 3 {
|
||||
return fmt.Errorf("Error listing records, expected 3, received %d", len(recs))
|
||||
}
|
||||
rsp.Msg = "Success"
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *Example) TestListLimit(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
|
||||
for i := 0; i < 10; i++ {
|
||||
if err := writeWithExpiry(fmt.Sprintf("TestLimit%d", i), "bar", 5*time.Second); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
recs, err := store.List(store.Prefix("TestLimit"), store.Limit(2))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error listing from store %s", err)
|
||||
}
|
||||
log.Infof("Recs limit %+v", recs)
|
||||
if len(recs) != 2 {
|
||||
return fmt.Errorf("Error listing records with limit, expected 2, received %d", len(recs))
|
||||
}
|
||||
rsp.Msg = "Success"
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *Example) TestListOffset(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
|
||||
for i := 0; i < 20; i++ {
|
||||
if err := writeWithExpiry(fmt.Sprintf("TestOffset%d", i), "bar", 5*time.Second); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
recs, err := store.List(store.Prefix("TestOffset"), store.Offset(5))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error listing from store %s", err)
|
||||
}
|
||||
log.Infof("Recs offset %+v", recs)
|
||||
if len(recs) != 15 {
|
||||
return fmt.Errorf("Error listing records with offset, expected 15, received %d", len(recs))
|
||||
}
|
||||
|
||||
rsp.Msg = "Success"
|
||||
return nil
|
||||
|
||||
}
|
||||
15
test/kv/main.go
Normal file
15
test/kv/main.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/micro/services/kv/handler"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
)
|
||||
|
||||
func main() {
|
||||
srv := service.New(service.Name("example"))
|
||||
|
||||
srv.Handle(new(handler.Example))
|
||||
|
||||
srv.Run()
|
||||
}
|
||||
198
test/kv/proto/example.pb.go
Normal file
198
test/kv/proto/example.pb.go
Normal file
@@ -0,0 +1,198 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: test/service/storeexample/proto/example.proto
|
||||
|
||||
package srv_test_example
|
||||
|
||||
import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
grpc "google.golang.org/grpc"
|
||||
codes "google.golang.org/grpc/codes"
|
||||
status "google.golang.org/grpc/status"
|
||||
math "math"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
type Request struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Request) Reset() { *m = Request{} }
|
||||
func (m *Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*Request) ProtoMessage() {}
|
||||
func (*Request) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_060cb6963cd2b8f6, []int{0}
|
||||
}
|
||||
|
||||
func (m *Request) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Request.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Request.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Request) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Request.Merge(m, src)
|
||||
}
|
||||
func (m *Request) XXX_Size() int {
|
||||
return xxx_messageInfo_Request.Size(m)
|
||||
}
|
||||
func (m *Request) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Request.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Request proto.InternalMessageInfo
|
||||
|
||||
type Response struct {
|
||||
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Response) Reset() { *m = Response{} }
|
||||
func (m *Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*Response) ProtoMessage() {}
|
||||
func (*Response) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_060cb6963cd2b8f6, []int{1}
|
||||
}
|
||||
|
||||
func (m *Response) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Response.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Response.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Response) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Response.Merge(m, src)
|
||||
}
|
||||
func (m *Response) XXX_Size() int {
|
||||
return xxx_messageInfo_Response.Size(m)
|
||||
}
|
||||
func (m *Response) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Response.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Response proto.InternalMessageInfo
|
||||
|
||||
func (m *Response) GetMsg() string {
|
||||
if m != nil {
|
||||
return m.Msg
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*Request)(nil), "srv.test_example.Request")
|
||||
proto.RegisterType((*Response)(nil), "srv.test_example.Response")
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterFile("test/service/storeexample/proto/example.proto", fileDescriptor_060cb6963cd2b8f6)
|
||||
}
|
||||
|
||||
var fileDescriptor_060cb6963cd2b8f6 = []byte{
|
||||
// 155 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2d, 0x49, 0x2d, 0x2e,
|
||||
0xd1, 0x2f, 0x4e, 0x2d, 0x2a, 0xcb, 0x4c, 0x4e, 0xd5, 0x2f, 0x2e, 0xc9, 0x2f, 0x4a, 0x4d, 0xad,
|
||||
0x48, 0xcc, 0x2d, 0xc8, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0xf2, 0xf4, 0xc0,
|
||||
0x3c, 0x21, 0x81, 0xe2, 0xa2, 0x32, 0x3d, 0x90, 0x96, 0x78, 0xa8, 0xb8, 0x12, 0x27, 0x17, 0x7b,
|
||||
0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x92, 0x0c, 0x17, 0x47, 0x50, 0x6a, 0x71, 0x41, 0x7e,
|
||||
0x5e, 0x71, 0xaa, 0x90, 0x00, 0x17, 0x73, 0x6e, 0x71, 0xba, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67,
|
||||
0x10, 0x88, 0x69, 0x14, 0xc0, 0xc5, 0xee, 0x0a, 0xd1, 0x23, 0xe4, 0xca, 0xc5, 0x15, 0x92, 0x5a,
|
||||
0x5c, 0xe2, 0x5a, 0x51, 0x90, 0x59, 0x54, 0x29, 0x24, 0xa9, 0x87, 0x6e, 0xa8, 0x1e, 0xd4, 0x44,
|
||||
0x29, 0x29, 0x6c, 0x52, 0x10, 0x1b, 0x94, 0x18, 0x92, 0xd8, 0xc0, 0x6e, 0x32, 0x06, 0x04, 0x00,
|
||||
0x00, 0xff, 0xff, 0x4c, 0xad, 0xe6, 0x25, 0xc4, 0x00, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ context.Context
|
||||
var _ grpc.ClientConn
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the grpc package it is being compiled against.
|
||||
const _ = grpc.SupportPackageIsVersion4
|
||||
|
||||
// ExampleClient is the client API for Example service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
|
||||
type ExampleClient interface {
|
||||
TestExpiry(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
|
||||
}
|
||||
|
||||
type exampleClient struct {
|
||||
cc *grpc.ClientConn
|
||||
}
|
||||
|
||||
func NewExampleClient(cc *grpc.ClientConn) ExampleClient {
|
||||
return &exampleClient{cc}
|
||||
}
|
||||
|
||||
func (c *exampleClient) TestExpiry(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) {
|
||||
out := new(Response)
|
||||
err := c.cc.Invoke(ctx, "/srv.test_example.Example/TestExpiry", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// ExampleServer is the server API for Example service.
|
||||
type ExampleServer interface {
|
||||
TestExpiry(context.Context, *Request) (*Response, error)
|
||||
}
|
||||
|
||||
// UnimplementedExampleServer can be embedded to have forward compatible implementations.
|
||||
type UnimplementedExampleServer struct {
|
||||
}
|
||||
|
||||
func (*UnimplementedExampleServer) TestExpiry(ctx context.Context, req *Request) (*Response, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method TestExpiry not implemented")
|
||||
}
|
||||
|
||||
func RegisterExampleServer(s *grpc.Server, srv ExampleServer) {
|
||||
s.RegisterService(&_Example_serviceDesc, srv)
|
||||
}
|
||||
|
||||
func _Example_TestExpiry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(Request)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(ExampleServer).TestExpiry(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/srv.test_example.Example/TestExpiry",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(ExampleServer).TestExpiry(ctx, req.(*Request))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
var _Example_serviceDesc = grpc.ServiceDesc{
|
||||
ServiceName: "srv.test_example.Example",
|
||||
HandlerType: (*ExampleServer)(nil),
|
||||
Methods: []grpc.MethodDesc{
|
||||
{
|
||||
MethodName: "TestExpiry",
|
||||
Handler: _Example_TestExpiry_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{},
|
||||
Metadata: "test/service/storeexample/proto/example.proto",
|
||||
}
|
||||
144
test/kv/proto/example.pb.micro.go
Normal file
144
test/kv/proto/example.pb.micro.go
Normal file
@@ -0,0 +1,144 @@
|
||||
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||
// source: test/service/storeexample/proto/example.proto
|
||||
|
||||
package srv_test_example
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
import (
|
||||
context "context"
|
||||
api "github.com/micro/go-micro/v3/api"
|
||||
client "github.com/micro/go-micro/v3/client"
|
||||
server "github.com/micro/go-micro/v3/server"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ api.Endpoint
|
||||
var _ context.Context
|
||||
var _ client.Option
|
||||
var _ server.Option
|
||||
|
||||
// Api Endpoints for Example service
|
||||
|
||||
func NewExampleEndpoints() []*api.Endpoint {
|
||||
return []*api.Endpoint{}
|
||||
}
|
||||
|
||||
// Client API for Example service
|
||||
|
||||
type ExampleService interface {
|
||||
TestExpiry(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
TestList(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
TestListLimit(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
TestListOffset(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
}
|
||||
|
||||
type exampleService struct {
|
||||
c client.Client
|
||||
name string
|
||||
}
|
||||
|
||||
func NewExampleService(name string, c client.Client) ExampleService {
|
||||
return &exampleService{
|
||||
c: c,
|
||||
name: name,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *exampleService) TestExpiry(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
|
||||
req := c.c.NewRequest(c.name, "Example.TestExpiry", in)
|
||||
out := new(Response)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *exampleService) TestList(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
|
||||
req := c.c.NewRequest(c.name, "Example.TestList", in)
|
||||
out := new(Response)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *exampleService) TestListLimit(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
|
||||
req := c.c.NewRequest(c.name, "Example.TestListLimit", in)
|
||||
out := new(Response)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *exampleService) TestListOffset(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
|
||||
req := c.c.NewRequest(c.name, "Example.TestListOffset", in)
|
||||
out := new(Response)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Server API for Example service
|
||||
|
||||
type ExampleHandler interface {
|
||||
TestExpiry(context.Context, *Request, *Response) error
|
||||
TestList(context.Context, *Request, *Response) error
|
||||
TestListLimit(context.Context, *Request, *Response) error
|
||||
TestListOffset(context.Context, *Request, *Response) error
|
||||
}
|
||||
|
||||
func RegisterExampleHandler(s server.Server, hdlr ExampleHandler, opts ...server.HandlerOption) error {
|
||||
type example interface {
|
||||
TestExpiry(ctx context.Context, in *Request, out *Response) error
|
||||
TestList(ctx context.Context, in *Request, out *Response) error
|
||||
TestListLimit(ctx context.Context, in *Request, out *Response) error
|
||||
TestListOffset(ctx context.Context, in *Request, out *Response) error
|
||||
}
|
||||
type Example struct {
|
||||
example
|
||||
}
|
||||
h := &exampleHandler{hdlr}
|
||||
return s.Handle(s.NewHandler(&Example{h}, opts...))
|
||||
}
|
||||
|
||||
type exampleHandler struct {
|
||||
ExampleHandler
|
||||
}
|
||||
|
||||
func (h *exampleHandler) TestExpiry(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.ExampleHandler.TestExpiry(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *exampleHandler) TestList(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.ExampleHandler.TestList(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *exampleHandler) TestListLimit(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.ExampleHandler.TestListLimit(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *exampleHandler) TestListOffset(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.ExampleHandler.TestListOffset(ctx, in, out)
|
||||
}
|
||||
17
test/kv/proto/example.proto
Normal file
17
test/kv/proto/example.proto
Normal file
@@ -0,0 +1,17 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package srv.test_example;
|
||||
|
||||
service Example {
|
||||
rpc TestExpiry(Request) returns (Response) {}
|
||||
rpc TestList(Request) returns (Response) {}
|
||||
rpc TestListLimit(Request) returns (Response) {}
|
||||
rpc TestListOffset(Request) returns (Response) {}
|
||||
}
|
||||
|
||||
message Request {
|
||||
}
|
||||
|
||||
message Response {
|
||||
string msg = 1;
|
||||
}
|
||||
3
test/logger/README.md
Normal file
3
test/logger/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Logger
|
||||
|
||||
A service which demonstrates how to use the logger
|
||||
19
test/logger/main.go
Normal file
19
test/logger/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
)
|
||||
|
||||
func main() {
|
||||
go func() {
|
||||
for {
|
||||
logger.Infof("This is a log line %s", time.Now())
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
}()
|
||||
|
||||
service.Run()
|
||||
}
|
||||
24
test/pubsub/README.md
Normal file
24
test/pubsub/README.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# PubSub
|
||||
|
||||
A simple example of using PubSub
|
||||
|
||||
## Overview
|
||||
|
||||
This example is a simple pubsub service which subscribes to a topic and periodically publishes
|
||||
to the same place. The interface for how it works may change but its simple enough.
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
# start micro
|
||||
micro server
|
||||
|
||||
# run pubsub
|
||||
micro run pubsub
|
||||
|
||||
# check status
|
||||
micro status
|
||||
|
||||
# get the logs
|
||||
micro logs pubsub
|
||||
```
|
||||
50
test/pubsub/main.go
Normal file
50
test/pubsub/main.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
pb "github.com/micro/services/pubsub/proto"
|
||||
)
|
||||
|
||||
// Pub will publish messages every second
|
||||
func Pub() {
|
||||
ev := service.NewEvent("messages")
|
||||
|
||||
for {
|
||||
err := ev.Publish(context.TODO(), &pb.Message{
|
||||
Id: "1",
|
||||
Body: []byte(`hello`),
|
||||
})
|
||||
if err != nil {
|
||||
logger.Error("Error Publish:", err.Error())
|
||||
}
|
||||
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
}
|
||||
|
||||
// Sub processes messages
|
||||
func Sub(ctx context.Context, msg *pb.Message) error {
|
||||
fmt.Println("Received a message")
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
service := service.New(
|
||||
service.Name("pubsub"),
|
||||
)
|
||||
|
||||
// subscribe to the "messages" topic
|
||||
service.Subscribe("messages", Sub)
|
||||
|
||||
// publish messages
|
||||
go Pub()
|
||||
|
||||
if err := service.Run(); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
157
test/pubsub/proto/pubsub.pb.go
Normal file
157
test/pubsub/proto/pubsub.pb.go
Normal file
@@ -0,0 +1,157 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.11.4
|
||||
// source: github.com/micro/services/pubsub/proto/pubsub.proto
|
||||
|
||||
package pubsub
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type Message struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Message) Reset() {
|
||||
*x = Message{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Message) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Message) ProtoMessage() {}
|
||||
|
||||
func (x *Message) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Message.ProtoReflect.Descriptor instead.
|
||||
func (*Message) Descriptor() ([]byte, []int) {
|
||||
return file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *Message) GetId() string {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Message) GetBody() []byte {
|
||||
if x != nil {
|
||||
return x.Body
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_github_com_micro_services_pubsub_proto_pubsub_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc = []byte{
|
||||
0x0a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x63,
|
||||
0x72, 0x6f, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x73,
|
||||
0x75, 0x62, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x2e,
|
||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x22, 0x2d, 0x0a,
|
||||
0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79,
|
||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x62, 0x06, 0x70, 0x72,
|
||||
0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescOnce sync.Once
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData = file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescGZIP() []byte {
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescOnce.Do(func() {
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData)
|
||||
})
|
||||
return file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_github_com_micro_services_pubsub_proto_pubsub_proto_goTypes = []interface{}{
|
||||
(*Message)(nil), // 0: pubsub.Message
|
||||
}
|
||||
var file_github_com_micro_services_pubsub_proto_pubsub_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_github_com_micro_services_pubsub_proto_pubsub_proto_init() }
|
||||
func file_github_com_micro_services_pubsub_proto_pubsub_proto_init() {
|
||||
if File_github_com_micro_services_pubsub_proto_pubsub_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Message); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_github_com_micro_services_pubsub_proto_pubsub_proto_goTypes,
|
||||
DependencyIndexes: file_github_com_micro_services_pubsub_proto_pubsub_proto_depIdxs,
|
||||
MessageInfos: file_github_com_micro_services_pubsub_proto_pubsub_proto_msgTypes,
|
||||
}.Build()
|
||||
File_github_com_micro_services_pubsub_proto_pubsub_proto = out.File
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_rawDesc = nil
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_goTypes = nil
|
||||
file_github_com_micro_services_pubsub_proto_pubsub_proto_depIdxs = nil
|
||||
}
|
||||
21
test/pubsub/proto/pubsub.pb.micro.go
Normal file
21
test/pubsub/proto/pubsub.pb.micro.go
Normal file
@@ -0,0 +1,21 @@
|
||||
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||
// source: github.com/micro/services/pubsub/proto/pubsub.proto
|
||||
|
||||
package pubsub
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
8
test/pubsub/proto/pubsub.proto
Normal file
8
test/pubsub/proto/pubsub.proto
Normal file
@@ -0,0 +1,8 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package pubsub;
|
||||
|
||||
message Message {
|
||||
string id = 1;
|
||||
bytes body = 2;
|
||||
}
|
||||
3
test/routes/README.md
Normal file
3
test/routes/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Route Guide
|
||||
|
||||
A route guide service ported from grpc examples
|
||||
335
test/routes/proto/stream.pb.go
Normal file
335
test/routes/proto/stream.pb.go
Normal file
@@ -0,0 +1,335 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: proto/stream.proto
|
||||
|
||||
package stream
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
// Points are represented as latitude-longitude pairs in the E7 representation
|
||||
// (degrees multiplied by 10**7 and rounded to the nearest integer).
|
||||
// Latitudes should be in the range +/- 90 degrees and longitude should be in
|
||||
// the range +/- 180 degrees (inclusive).
|
||||
type Point struct {
|
||||
Latitude int32 `protobuf:"varint,1,opt,name=latitude,proto3" json:"latitude,omitempty"`
|
||||
Longitude int32 `protobuf:"varint,2,opt,name=longitude,proto3" json:"longitude,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Point) Reset() { *m = Point{} }
|
||||
func (m *Point) String() string { return proto.CompactTextString(m) }
|
||||
func (*Point) ProtoMessage() {}
|
||||
func (*Point) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_45777bc300452f06, []int{0}
|
||||
}
|
||||
|
||||
func (m *Point) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Point.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Point) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Point.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Point) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Point.Merge(m, src)
|
||||
}
|
||||
func (m *Point) XXX_Size() int {
|
||||
return xxx_messageInfo_Point.Size(m)
|
||||
}
|
||||
func (m *Point) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Point.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Point proto.InternalMessageInfo
|
||||
|
||||
func (m *Point) GetLatitude() int32 {
|
||||
if m != nil {
|
||||
return m.Latitude
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Point) GetLongitude() int32 {
|
||||
if m != nil {
|
||||
return m.Longitude
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// A latitude-longitude rectangle, represented as two diagonally opposite
|
||||
// points "lo" and "hi".
|
||||
type Rectangle struct {
|
||||
// One corner of the rectangle.
|
||||
Lo *Point `protobuf:"bytes,1,opt,name=lo,proto3" json:"lo,omitempty"`
|
||||
// The other corner of the rectangle.
|
||||
Hi *Point `protobuf:"bytes,2,opt,name=hi,proto3" json:"hi,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Rectangle) Reset() { *m = Rectangle{} }
|
||||
func (m *Rectangle) String() string { return proto.CompactTextString(m) }
|
||||
func (*Rectangle) ProtoMessage() {}
|
||||
func (*Rectangle) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_45777bc300452f06, []int{1}
|
||||
}
|
||||
|
||||
func (m *Rectangle) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Rectangle.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Rectangle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Rectangle.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Rectangle) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Rectangle.Merge(m, src)
|
||||
}
|
||||
func (m *Rectangle) XXX_Size() int {
|
||||
return xxx_messageInfo_Rectangle.Size(m)
|
||||
}
|
||||
func (m *Rectangle) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Rectangle.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Rectangle proto.InternalMessageInfo
|
||||
|
||||
func (m *Rectangle) GetLo() *Point {
|
||||
if m != nil {
|
||||
return m.Lo
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Rectangle) GetHi() *Point {
|
||||
if m != nil {
|
||||
return m.Hi
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// A feature names something at a given point.
|
||||
// If a feature could not be named, the name is empty.
|
||||
type Feature struct {
|
||||
// The name of the feature.
|
||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||
// The point where the feature is detected.
|
||||
Location *Point `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Feature) Reset() { *m = Feature{} }
|
||||
func (m *Feature) String() string { return proto.CompactTextString(m) }
|
||||
func (*Feature) ProtoMessage() {}
|
||||
func (*Feature) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_45777bc300452f06, []int{2}
|
||||
}
|
||||
|
||||
func (m *Feature) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Feature.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Feature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Feature.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Feature) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Feature.Merge(m, src)
|
||||
}
|
||||
func (m *Feature) XXX_Size() int {
|
||||
return xxx_messageInfo_Feature.Size(m)
|
||||
}
|
||||
func (m *Feature) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Feature.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Feature proto.InternalMessageInfo
|
||||
|
||||
func (m *Feature) GetName() string {
|
||||
if m != nil {
|
||||
return m.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *Feature) GetLocation() *Point {
|
||||
if m != nil {
|
||||
return m.Location
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// A RouteNote is a message sent while at a given point.
|
||||
type RouteNote struct {
|
||||
// The location from which the message is sent.
|
||||
Location *Point `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"`
|
||||
// The message to be sent.
|
||||
Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *RouteNote) Reset() { *m = RouteNote{} }
|
||||
func (m *RouteNote) String() string { return proto.CompactTextString(m) }
|
||||
func (*RouteNote) ProtoMessage() {}
|
||||
func (*RouteNote) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_45777bc300452f06, []int{3}
|
||||
}
|
||||
|
||||
func (m *RouteNote) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_RouteNote.Unmarshal(m, b)
|
||||
}
|
||||
func (m *RouteNote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_RouteNote.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *RouteNote) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_RouteNote.Merge(m, src)
|
||||
}
|
||||
func (m *RouteNote) XXX_Size() int {
|
||||
return xxx_messageInfo_RouteNote.Size(m)
|
||||
}
|
||||
func (m *RouteNote) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_RouteNote.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_RouteNote proto.InternalMessageInfo
|
||||
|
||||
func (m *RouteNote) GetLocation() *Point {
|
||||
if m != nil {
|
||||
return m.Location
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *RouteNote) GetMessage() string {
|
||||
if m != nil {
|
||||
return m.Message
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// A RouteSummary is received in response to a RecordRoute rpc.
|
||||
// It contains the number of individual points received, the number of
|
||||
// detected features, and the total distance covered as the cumulative sum of
|
||||
// the distance between each point.
|
||||
type RouteSummary struct {
|
||||
// The number of points received.
|
||||
PointCount int32 `protobuf:"varint,1,opt,name=point_count,json=pointCount,proto3" json:"point_count,omitempty"`
|
||||
// The number of known features passed while traversing the route.
|
||||
FeatureCount int32 `protobuf:"varint,2,opt,name=feature_count,json=featureCount,proto3" json:"feature_count,omitempty"`
|
||||
// The distance covered in metres.
|
||||
Distance int32 `protobuf:"varint,3,opt,name=distance,proto3" json:"distance,omitempty"`
|
||||
// The duration of the traversal in seconds.
|
||||
ElapsedTime int32 `protobuf:"varint,4,opt,name=elapsed_time,json=elapsedTime,proto3" json:"elapsed_time,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *RouteSummary) Reset() { *m = RouteSummary{} }
|
||||
func (m *RouteSummary) String() string { return proto.CompactTextString(m) }
|
||||
func (*RouteSummary) ProtoMessage() {}
|
||||
func (*RouteSummary) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_45777bc300452f06, []int{4}
|
||||
}
|
||||
|
||||
func (m *RouteSummary) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_RouteSummary.Unmarshal(m, b)
|
||||
}
|
||||
func (m *RouteSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_RouteSummary.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *RouteSummary) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_RouteSummary.Merge(m, src)
|
||||
}
|
||||
func (m *RouteSummary) XXX_Size() int {
|
||||
return xxx_messageInfo_RouteSummary.Size(m)
|
||||
}
|
||||
func (m *RouteSummary) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_RouteSummary.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_RouteSummary proto.InternalMessageInfo
|
||||
|
||||
func (m *RouteSummary) GetPointCount() int32 {
|
||||
if m != nil {
|
||||
return m.PointCount
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *RouteSummary) GetFeatureCount() int32 {
|
||||
if m != nil {
|
||||
return m.FeatureCount
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *RouteSummary) GetDistance() int32 {
|
||||
if m != nil {
|
||||
return m.Distance
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *RouteSummary) GetElapsedTime() int32 {
|
||||
if m != nil {
|
||||
return m.ElapsedTime
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*Point)(nil), "stream.Point")
|
||||
proto.RegisterType((*Rectangle)(nil), "stream.Rectangle")
|
||||
proto.RegisterType((*Feature)(nil), "stream.Feature")
|
||||
proto.RegisterType((*RouteNote)(nil), "stream.RouteNote")
|
||||
proto.RegisterType((*RouteSummary)(nil), "stream.RouteSummary")
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterFile("proto/stream.proto", fileDescriptor_45777bc300452f06)
|
||||
}
|
||||
|
||||
var fileDescriptor_45777bc300452f06 = []byte{
|
||||
// 371 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x52, 0x4f, 0x4b, 0xfb, 0x40,
|
||||
0x10, 0xed, 0xf6, 0xd7, 0x3f, 0xbf, 0x4c, 0x52, 0xc4, 0xc1, 0x43, 0x29, 0x8a, 0x1a, 0x2f, 0xf5,
|
||||
0x52, 0x4b, 0x05, 0x3d, 0x4b, 0xc1, 0x2a, 0x88, 0x94, 0xe8, 0xbd, 0xac, 0xc9, 0xda, 0x2e, 0x24,
|
||||
0xd9, 0x92, 0x6c, 0x0e, 0x7e, 0x0e, 0x3f, 0xa3, 0xdf, 0xc3, 0xcd, 0xee, 0x26, 0xb6, 0xb6, 0x78,
|
||||
0xcb, 0xbc, 0x37, 0x6f, 0xde, 0xec, 0x9b, 0x00, 0xae, 0x33, 0x21, 0xc5, 0x55, 0x2e, 0x33, 0x46,
|
||||
0x93, 0x91, 0x2e, 0xb0, 0x63, 0x2a, 0xff, 0x0e, 0xda, 0x73, 0xc1, 0x53, 0x89, 0x03, 0xf8, 0x1f,
|
||||
0x53, 0xc9, 0x65, 0x11, 0xb1, 0x3e, 0x39, 0x23, 0xc3, 0x76, 0x50, 0xd7, 0x78, 0x0c, 0x4e, 0x2c,
|
||||
0xd2, 0xa5, 0x21, 0x9b, 0x9a, 0xfc, 0x01, 0xfc, 0x47, 0x70, 0x02, 0x16, 0x4a, 0x9a, 0x2e, 0x63,
|
||||
0x86, 0x27, 0xd0, 0x8c, 0x85, 0x1e, 0xe0, 0x4e, 0x7a, 0x23, 0x6b, 0xa9, 0x1d, 0x02, 0x45, 0x94,
|
||||
0xf4, 0x8a, 0xeb, 0x11, 0xbb, 0xf4, 0x8a, 0xfb, 0x0f, 0xd0, 0xbd, 0x67, 0x54, 0x16, 0x19, 0x43,
|
||||
0x84, 0x56, 0x4a, 0x13, 0xb3, 0x8b, 0x13, 0xe8, 0x6f, 0xbc, 0x54, 0x3b, 0x8a, 0x50, 0x6d, 0x25,
|
||||
0xd2, 0xfd, 0x33, 0x6a, 0xda, 0x9f, 0xab, 0xa5, 0x44, 0x21, 0xd9, 0xb3, 0x90, 0xdb, 0x3a, 0xf2,
|
||||
0xa7, 0x0e, 0xfb, 0xd0, 0x4d, 0x58, 0x9e, 0xd3, 0xa5, 0x79, 0xa8, 0x13, 0x54, 0xa5, 0xff, 0x49,
|
||||
0xc0, 0xd3, 0x23, 0x5f, 0x8a, 0x24, 0xa1, 0xd9, 0x07, 0x9e, 0x82, 0xbb, 0x2e, 0xd5, 0x8b, 0x50,
|
||||
0x14, 0xa9, 0xb4, 0xa1, 0x81, 0x86, 0xa6, 0x25, 0x82, 0x17, 0xd0, 0x7b, 0x37, 0xaf, 0xb1, 0x2d,
|
||||
0x26, 0x3a, 0xcf, 0x82, 0xa6, 0x49, 0xe5, 0x1e, 0xf1, 0x5c, 0xa5, 0x17, 0xb2, 0xfe, 0x3f, 0x93,
|
||||
0x7b, 0x55, 0xe3, 0x39, 0x78, 0x2c, 0xa6, 0xeb, 0x9c, 0x45, 0x0b, 0xc9, 0x55, 0x16, 0x2d, 0xcd,
|
||||
0xbb, 0x16, 0x7b, 0x55, 0xd0, 0xe4, 0x8b, 0x00, 0xe8, 0xad, 0x66, 0x05, 0x57, 0x97, 0x1a, 0x01,
|
||||
0xcc, 0x98, 0xac, 0x32, 0xdc, 0x7e, 0xe5, 0xe0, 0xa0, 0x2a, 0x2d, 0xef, 0x37, 0xf0, 0x06, 0xbc,
|
||||
0x27, 0xe5, 0x66, 0x81, 0x1c, 0x0f, 0xab, 0x96, 0xfa, 0xa2, 0x7b, 0x54, 0x63, 0xa2, 0x74, 0xae,
|
||||
0xea, 0x10, 0x59, 0xa4, 0xbd, 0x7f, 0x1b, 0x1d, 0xd5, 0x53, 0x36, 0xf2, 0xf2, 0x1b, 0x43, 0x82,
|
||||
0xb7, 0xf6, 0x2c, 0xd3, 0x15, 0x95, 0x1b, 0x66, 0xd5, 0xa5, 0x06, 0xbb, 0x50, 0x29, 0x1b, 0x93,
|
||||
0xb7, 0x8e, 0xfe, 0x6d, 0xaf, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x12, 0xaf, 0xc8, 0xcc,
|
||||
0x02, 0x00, 0x00,
|
||||
}
|
||||
394
test/routes/proto/stream.pb.micro.go
Normal file
394
test/routes/proto/stream.pb.micro.go
Normal file
@@ -0,0 +1,394 @@
|
||||
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||
// source: proto/stream.proto
|
||||
|
||||
package stream
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
import (
|
||||
context "context"
|
||||
api "github.com/micro/micro/v3/service/api"
|
||||
client "github.com/micro/micro/v3/service/client"
|
||||
server "github.com/micro/micro/v3/service/server"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ api.Endpoint
|
||||
var _ context.Context
|
||||
var _ client.Option
|
||||
var _ server.Option
|
||||
|
||||
// Api Endpoints for RouteGuide service
|
||||
|
||||
func NewRouteGuideEndpoints() []*api.Endpoint {
|
||||
return []*api.Endpoint{}
|
||||
}
|
||||
|
||||
// Client API for RouteGuide service
|
||||
|
||||
type RouteGuideService interface {
|
||||
// Obtains the feature at a given position.
|
||||
GetFeature(ctx context.Context, in *Point, opts ...client.CallOption) (*Feature, error)
|
||||
// Obtains the Features available within the given Rectangle. Results are
|
||||
// streamed rather than returned at once (e.g. in a response message with a
|
||||
// repeated field), as the rectangle may cover a large area and contain a
|
||||
// huge number of features.
|
||||
ListFeatures(ctx context.Context, in *Rectangle, opts ...client.CallOption) (RouteGuide_ListFeaturesService, error)
|
||||
// Accepts a stream of Points on a route being traversed, returning a
|
||||
// RouteSummary when traversal is completed.
|
||||
RecordRoute(ctx context.Context, opts ...client.CallOption) (RouteGuide_RecordRouteService, error)
|
||||
// Accepts a stream of RouteNotes sent while a route is being traversed,
|
||||
// while receiving other RouteNotes (e.g. from other users).
|
||||
RouteChat(ctx context.Context, opts ...client.CallOption) (RouteGuide_RouteChatService, error)
|
||||
}
|
||||
|
||||
type routeGuideService struct {
|
||||
c client.Client
|
||||
name string
|
||||
}
|
||||
|
||||
func NewRouteGuideService(name string, c client.Client) RouteGuideService {
|
||||
return &routeGuideService{
|
||||
c: c,
|
||||
name: name,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *routeGuideService) GetFeature(ctx context.Context, in *Point, opts ...client.CallOption) (*Feature, error) {
|
||||
req := c.c.NewRequest(c.name, "RouteGuide.GetFeature", in)
|
||||
out := new(Feature)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *routeGuideService) ListFeatures(ctx context.Context, in *Rectangle, opts ...client.CallOption) (RouteGuide_ListFeaturesService, error) {
|
||||
req := c.c.NewRequest(c.name, "RouteGuide.ListFeatures", &Rectangle{})
|
||||
stream, err := c.c.Stream(ctx, req, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := stream.Send(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &routeGuideServiceListFeatures{stream}, nil
|
||||
}
|
||||
|
||||
type RouteGuide_ListFeaturesService interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Recv() (*Feature, error)
|
||||
}
|
||||
|
||||
type routeGuideServiceListFeatures struct {
|
||||
stream client.Stream
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceListFeatures) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceListFeatures) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceListFeatures) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceListFeatures) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceListFeatures) Recv() (*Feature, error) {
|
||||
m := new(Feature)
|
||||
err := x.stream.Recv(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func (c *routeGuideService) RecordRoute(ctx context.Context, opts ...client.CallOption) (RouteGuide_RecordRouteService, error) {
|
||||
req := c.c.NewRequest(c.name, "RouteGuide.RecordRoute", &Point{})
|
||||
stream, err := c.c.Stream(ctx, req, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &routeGuideServiceRecordRoute{stream}, nil
|
||||
}
|
||||
|
||||
type RouteGuide_RecordRouteService interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
CloseAndRecv() (*RouteSummary, error)
|
||||
Send(*Point) error
|
||||
}
|
||||
|
||||
type routeGuideServiceRecordRoute struct {
|
||||
stream client.Stream
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRecordRoute) CloseAndRecv() (*RouteSummary, error) {
|
||||
if err := x.stream.Close(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r := new(RouteSummary)
|
||||
err := x.RecvMsg(r)
|
||||
return r, err
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRecordRoute) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRecordRoute) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRecordRoute) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRecordRoute) Send(m *Point) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (c *routeGuideService) RouteChat(ctx context.Context, opts ...client.CallOption) (RouteGuide_RouteChatService, error) {
|
||||
req := c.c.NewRequest(c.name, "RouteGuide.RouteChat", &RouteNote{})
|
||||
stream, err := c.c.Stream(ctx, req, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &routeGuideServiceRouteChat{stream}, nil
|
||||
}
|
||||
|
||||
type RouteGuide_RouteChatService interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Send(*RouteNote) error
|
||||
Recv() (*RouteNote, error)
|
||||
}
|
||||
|
||||
type routeGuideServiceRouteChat struct {
|
||||
stream client.Stream
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRouteChat) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRouteChat) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRouteChat) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRouteChat) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRouteChat) Send(m *RouteNote) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideServiceRouteChat) Recv() (*RouteNote, error) {
|
||||
m := new(RouteNote)
|
||||
err := x.stream.Recv(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// Server API for RouteGuide service
|
||||
|
||||
type RouteGuideHandler interface {
|
||||
// Obtains the feature at a given position.
|
||||
GetFeature(context.Context, *Point, *Feature) error
|
||||
// Obtains the Features available within the given Rectangle. Results are
|
||||
// streamed rather than returned at once (e.g. in a response message with a
|
||||
// repeated field), as the rectangle may cover a large area and contain a
|
||||
// huge number of features.
|
||||
ListFeatures(context.Context, *Rectangle, RouteGuide_ListFeaturesStream) error
|
||||
// Accepts a stream of Points on a route being traversed, returning a
|
||||
// RouteSummary when traversal is completed.
|
||||
RecordRoute(context.Context, RouteGuide_RecordRouteStream) error
|
||||
// Accepts a stream of RouteNotes sent while a route is being traversed,
|
||||
// while receiving other RouteNotes (e.g. from other users).
|
||||
RouteChat(context.Context, RouteGuide_RouteChatStream) error
|
||||
}
|
||||
|
||||
func RegisterRouteGuideHandler(s server.Server, hdlr RouteGuideHandler, opts ...server.HandlerOption) error {
|
||||
type routeGuide interface {
|
||||
GetFeature(ctx context.Context, in *Point, out *Feature) error
|
||||
ListFeatures(ctx context.Context, stream server.Stream) error
|
||||
RecordRoute(ctx context.Context, stream server.Stream) error
|
||||
RouteChat(ctx context.Context, stream server.Stream) error
|
||||
}
|
||||
type RouteGuide struct {
|
||||
routeGuide
|
||||
}
|
||||
h := &routeGuideHandler{hdlr}
|
||||
return s.Handle(s.NewHandler(&RouteGuide{h}, opts...))
|
||||
}
|
||||
|
||||
type routeGuideHandler struct {
|
||||
RouteGuideHandler
|
||||
}
|
||||
|
||||
func (h *routeGuideHandler) GetFeature(ctx context.Context, in *Point, out *Feature) error {
|
||||
return h.RouteGuideHandler.GetFeature(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *routeGuideHandler) ListFeatures(ctx context.Context, stream server.Stream) error {
|
||||
m := new(Rectangle)
|
||||
if err := stream.Recv(m); err != nil {
|
||||
return err
|
||||
}
|
||||
return h.RouteGuideHandler.ListFeatures(ctx, m, &routeGuideListFeaturesStream{stream})
|
||||
}
|
||||
|
||||
type RouteGuide_ListFeaturesStream interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Send(*Feature) error
|
||||
}
|
||||
|
||||
type routeGuideListFeaturesStream struct {
|
||||
stream server.Stream
|
||||
}
|
||||
|
||||
func (x *routeGuideListFeaturesStream) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *routeGuideListFeaturesStream) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *routeGuideListFeaturesStream) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideListFeaturesStream) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideListFeaturesStream) Send(m *Feature) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (h *routeGuideHandler) RecordRoute(ctx context.Context, stream server.Stream) error {
|
||||
return h.RouteGuideHandler.RecordRoute(ctx, &routeGuideRecordRouteStream{stream})
|
||||
}
|
||||
|
||||
type RouteGuide_RecordRouteStream interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
SendAndClose(*RouteSummary) error
|
||||
Recv() (*Point, error)
|
||||
}
|
||||
|
||||
type routeGuideRecordRouteStream struct {
|
||||
stream server.Stream
|
||||
}
|
||||
|
||||
func (x *routeGuideRecordRouteStream) SendAndClose(in *RouteSummary) error {
|
||||
if err := x.SendMsg(in); err != nil {
|
||||
return err
|
||||
}
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *routeGuideRecordRouteStream) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *routeGuideRecordRouteStream) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideRecordRouteStream) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideRecordRouteStream) Recv() (*Point, error) {
|
||||
m := new(Point)
|
||||
if err := x.stream.Recv(m); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func (h *routeGuideHandler) RouteChat(ctx context.Context, stream server.Stream) error {
|
||||
return h.RouteGuideHandler.RouteChat(ctx, &routeGuideRouteChatStream{stream})
|
||||
}
|
||||
|
||||
type RouteGuide_RouteChatStream interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Send(*RouteNote) error
|
||||
Recv() (*RouteNote, error)
|
||||
}
|
||||
|
||||
type routeGuideRouteChatStream struct {
|
||||
stream server.Stream
|
||||
}
|
||||
|
||||
func (x *routeGuideRouteChatStream) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *routeGuideRouteChatStream) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *routeGuideRouteChatStream) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideRouteChatStream) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideRouteChatStream) Send(m *RouteNote) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *routeGuideRouteChatStream) Recv() (*RouteNote, error) {
|
||||
m := new(RouteNote)
|
||||
if err := x.stream.Recv(m); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
73
test/routes/proto/stream.proto
Normal file
73
test/routes/proto/stream.proto
Normal file
@@ -0,0 +1,73 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package stream;
|
||||
|
||||
// this service uses the grpc example as a foundation:
|
||||
// https://grpc.io/docs/languages/go/basics/
|
||||
// https://github.com/grpc/grpc-go/tree/master/examples/route_guide
|
||||
|
||||
service RouteGuide {
|
||||
// Obtains the feature at a given position.
|
||||
rpc GetFeature(Point) returns (Feature) {}
|
||||
// Obtains the Features available within the given Rectangle. Results are
|
||||
// streamed rather than returned at once (e.g. in a response message with a
|
||||
// repeated field), as the rectangle may cover a large area and contain a
|
||||
// huge number of features.
|
||||
rpc ListFeatures(Rectangle) returns (stream Feature) {}
|
||||
// Accepts a stream of Points on a route being traversed, returning a
|
||||
// RouteSummary when traversal is completed.
|
||||
rpc RecordRoute(stream Point) returns (RouteSummary) {}
|
||||
// Accepts a stream of RouteNotes sent while a route is being traversed,
|
||||
// while receiving other RouteNotes (e.g. from other users).
|
||||
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
|
||||
}
|
||||
|
||||
// Points are represented as latitude-longitude pairs in the E7 representation
|
||||
// (degrees multiplied by 10**7 and rounded to the nearest integer).
|
||||
// Latitudes should be in the range +/- 90 degrees and longitude should be in
|
||||
// the range +/- 180 degrees (inclusive).
|
||||
message Point {
|
||||
int32 latitude = 1;
|
||||
int32 longitude = 2;
|
||||
}
|
||||
|
||||
// A latitude-longitude rectangle, represented as two diagonally opposite
|
||||
// points "lo" and "hi".
|
||||
message Rectangle {
|
||||
// One corner of the rectangle.
|
||||
Point lo = 1;
|
||||
// The other corner of the rectangle.
|
||||
Point hi = 2;
|
||||
}
|
||||
|
||||
// A feature names something at a given point.
|
||||
// If a feature could not be named, the name is empty.
|
||||
message Feature {
|
||||
// The name of the feature.
|
||||
string name = 1;
|
||||
// The point where the feature is detected.
|
||||
Point location = 2;
|
||||
}
|
||||
|
||||
// A RouteNote is a message sent while at a given point.
|
||||
message RouteNote {
|
||||
// The location from which the message is sent.
|
||||
Point location = 1;
|
||||
// The message to be sent.
|
||||
string message = 2;
|
||||
}
|
||||
|
||||
// A RouteSummary is received in response to a RecordRoute rpc.
|
||||
// It contains the number of individual points received, the number of
|
||||
// detected features, and the total distance covered as the cumulative sum of
|
||||
// the distance between each point.
|
||||
message RouteSummary {
|
||||
// The number of points received.
|
||||
int32 point_count = 1;
|
||||
// The number of known features passed while traversing the route.
|
||||
int32 feature_count = 2;
|
||||
// The distance covered in metres.
|
||||
int32 distance = 3;
|
||||
// The duration of the traversal in seconds.
|
||||
int32 elapsed_time = 4;
|
||||
}
|
||||
156
test/routes/routes-client/main.go
Normal file
156
test/routes/routes-client/main.go
Normal file
@@ -0,0 +1,156 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
pb "github.com/micro/services/routes/proto"
|
||||
)
|
||||
|
||||
func main() {
|
||||
srv := service.New()
|
||||
cli := pb.NewRouteGuideService("rpc", srv.Client())
|
||||
|
||||
// Looking for a valid feature
|
||||
logger.Infof("Testing Unary... Starting")
|
||||
printFeature(cli, &pb.Point{Latitude: 409146138, Longitude: -746188906})
|
||||
printFeature(cli, &pb.Point{Latitude: 0, Longitude: 0})
|
||||
logger.Infof("Testing Unary... Done")
|
||||
|
||||
// Looking for features between 40, -75 and 42, -73.
|
||||
logger.Infof("Testing Server Streaming... Starting")
|
||||
printFeatures(cli, &pb.Rectangle{
|
||||
Lo: &pb.Point{Latitude: 400000000, Longitude: -750000000},
|
||||
Hi: &pb.Point{Latitude: 420000000, Longitude: -730000000},
|
||||
})
|
||||
logger.Infof("Testing Server Streaming... Done")
|
||||
|
||||
// RecordRoute
|
||||
logger.Infof("Testing Client Streaming... Starting")
|
||||
runRecordRoute(cli)
|
||||
logger.Infof("Testing Client Streaming... Done")
|
||||
|
||||
// RouteChat
|
||||
logger.Infof("Testing Bidirectional Streaming... Starting")
|
||||
runRouteChat(cli)
|
||||
logger.Infof("Testing Bidirectional Streaming... Done")
|
||||
|
||||
logger.Infof("Client completed ok")
|
||||
|
||||
// prevent the client from restarting when running using micro run
|
||||
srv.Run()
|
||||
}
|
||||
|
||||
// printFeature gets the feature for the given point.
|
||||
func printFeature(client pb.RouteGuideService, point *pb.Point) {
|
||||
logger.Tracef("Getting feature for point (%d, %d)", point.Latitude, point.Longitude)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
feature, err := client.GetFeature(ctx, point)
|
||||
if err != nil {
|
||||
logger.Fatalf("%v.GetFeatures(_) = _, %v: ", client, err)
|
||||
}
|
||||
logger.Tracef("Got Features: %v", feature)
|
||||
}
|
||||
|
||||
// printFeatures lists all the features within the given bounding Rectangle.
|
||||
func printFeatures(client pb.RouteGuideService, rect *pb.Rectangle) {
|
||||
logger.Tracef("Looking for features within %v", rect)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
stream, err := client.ListFeatures(ctx, rect)
|
||||
if err != nil {
|
||||
logger.Fatalf("%v.ListFeatures(_) = _, %v", client, err)
|
||||
}
|
||||
for {
|
||||
feature, err := stream.Recv()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
logger.Fatalf("%v.ListFeatures(_) = _, %v", client, err)
|
||||
}
|
||||
logger.Tracef("Got Feature: %v", feature)
|
||||
}
|
||||
}
|
||||
|
||||
// runRecordRoute sends a sequence of points to server and expects to get a RouteSummary from server.
|
||||
func runRecordRoute(client pb.RouteGuideService) {
|
||||
// Create a random number of random points
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
pointCount := int(r.Int31n(100)) + 2 // Traverse at least two points
|
||||
var points []*pb.Point
|
||||
for i := 0; i < pointCount; i++ {
|
||||
points = append(points, randomPoint(r))
|
||||
}
|
||||
logger.Tracef("Traversing %d points.", len(points))
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
stream, err := client.RecordRoute(ctx)
|
||||
if err != nil {
|
||||
logger.Fatalf("%v.RecordRoute(_) = _, %v", client, err)
|
||||
}
|
||||
for _, point := range points {
|
||||
if err := stream.Send(point); err != nil {
|
||||
logger.Fatalf("%v.Send(%v) = %v", stream, point, err)
|
||||
}
|
||||
}
|
||||
|
||||
summary, err := stream.CloseAndRecv()
|
||||
if err != nil {
|
||||
logger.Fatalf("%v.CloseAndRecv() got error %v, want %v", stream, err, nil)
|
||||
}
|
||||
logger.Tracef("Route summary: %v", summary)
|
||||
}
|
||||
|
||||
// runRouteChat receives a sequence of route notes, while sending notes for various locations.
|
||||
func runRouteChat(client pb.RouteGuideService) {
|
||||
notes := []*pb.RouteNote{
|
||||
{Location: &pb.Point{Latitude: 0, Longitude: 1}, Message: "First message"},
|
||||
{Location: &pb.Point{Latitude: 0, Longitude: 2}, Message: "Second message"},
|
||||
{Location: &pb.Point{Latitude: 0, Longitude: 3}, Message: "Third message"},
|
||||
{Location: &pb.Point{Latitude: 0, Longitude: 1}, Message: "Fourth message"},
|
||||
{Location: &pb.Point{Latitude: 0, Longitude: 2}, Message: "Fifth message"},
|
||||
{Location: &pb.Point{Latitude: 0, Longitude: 3}, Message: "Sixth message"},
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
stream, err := client.RouteChat(ctx)
|
||||
if err != nil {
|
||||
logger.Fatalf("%v.RouteChat(_) = _, %v", client, err)
|
||||
}
|
||||
waitc := make(chan struct{})
|
||||
go func() {
|
||||
for {
|
||||
in, err := stream.Recv()
|
||||
if err == io.EOF {
|
||||
// read done.
|
||||
close(waitc)
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
logger.Fatalf("Failed to receive a note : %v", err)
|
||||
}
|
||||
logger.Tracef("Got message %s at point(%d, %d)", in.Message, in.Location.Latitude, in.Location.Longitude)
|
||||
}
|
||||
}()
|
||||
for _, note := range notes {
|
||||
if err := stream.Send(note); err != nil {
|
||||
logger.Fatalf("Failed to send a note: %v", err)
|
||||
}
|
||||
}
|
||||
if err := stream.Close(); err != nil {
|
||||
logger.Fatalf("%v.Close() got error: %v, want %v", stream, err, nil)
|
||||
}
|
||||
<-waitc
|
||||
}
|
||||
|
||||
func randomPoint(r *rand.Rand) *pb.Point {
|
||||
lat := (r.Int31n(180) - 90) * 1e7
|
||||
long := (r.Int31n(360) - 180) * 1e7
|
||||
return &pb.Point{Latitude: lat, Longitude: long}
|
||||
}
|
||||
113
test/routes/routes-server/handler/handler.go
Normal file
113
test/routes/routes-server/handler/handler.go
Normal file
@@ -0,0 +1,113 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
pb "github.com/micro/services/routes/proto"
|
||||
)
|
||||
|
||||
// RouteGuide implements the route guide handler interface
|
||||
type RouteGuide struct {
|
||||
Features []*pb.Feature
|
||||
Notes map[string][]*pb.RouteNote
|
||||
NotesLock sync.Mutex
|
||||
}
|
||||
|
||||
// GetFeature obtains the feature at a given position.
|
||||
func (r *RouteGuide) GetFeature(ctx context.Context, point *pb.Point, feature *pb.Feature) error {
|
||||
for _, f := range r.Features {
|
||||
if proto.Equal(f.Location, point) {
|
||||
*feature = *f
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// No feature was found, return an unnamed feature
|
||||
feature.Location = point
|
||||
return nil
|
||||
}
|
||||
|
||||
// ListFeatures obtains the Features available within the given Rectangle. Results are
|
||||
// streamed rather than returned at once (e.g. in a response message with a
|
||||
// repeated field), as the rectangle may cover a large area and contain a
|
||||
// huge number of features.
|
||||
func (r *RouteGuide) ListFeatures(ctx context.Context, rect *pb.Rectangle, stream pb.RouteGuide_ListFeaturesStream) error {
|
||||
for _, f := range r.Features {
|
||||
if inRange(f.Location, rect) {
|
||||
if err := stream.Send(f); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RecordRoute accepts a stream of Points on a route being traversed, returning a
|
||||
// RouteSummary when traversal is completed.
|
||||
func (r *RouteGuide) RecordRoute(ctx context.Context, stream pb.RouteGuide_RecordRouteStream) error {
|
||||
var pointCount, featureCount, distance int32
|
||||
var lastPoint *pb.Point
|
||||
startTime := time.Now()
|
||||
|
||||
for {
|
||||
point, err := stream.Recv()
|
||||
if err == io.EOF {
|
||||
endTime := time.Now()
|
||||
|
||||
return stream.SendAndClose(&pb.RouteSummary{
|
||||
PointCount: pointCount,
|
||||
FeatureCount: featureCount,
|
||||
Distance: distance,
|
||||
ElapsedTime: int32(endTime.Sub(startTime).Seconds()),
|
||||
})
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pointCount++
|
||||
for _, f := range r.Features {
|
||||
if proto.Equal(f.Location, point) {
|
||||
featureCount++
|
||||
}
|
||||
}
|
||||
if lastPoint != nil {
|
||||
distance += calcDistance(lastPoint, point)
|
||||
}
|
||||
lastPoint = point
|
||||
}
|
||||
}
|
||||
|
||||
// RouteChat accepts a stream of RouteNotes sent while a route is being traversed,
|
||||
// while receiving other RouteNotes (e.g. from other users).
|
||||
func (r *RouteGuide) RouteChat(ctx context.Context, stream pb.RouteGuide_RouteChatStream) error {
|
||||
for {
|
||||
in, err := stream.Recv()
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
key := serialize(in.Location)
|
||||
|
||||
r.NotesLock.Lock()
|
||||
r.Notes[key] = append(r.Notes[key], in)
|
||||
// Note: this copy prevents blocking other clients while serving this one.
|
||||
// We don't need to do a deep copy, because elements in the slice are
|
||||
// insert-only and never modified.
|
||||
rn := make([]*pb.RouteNote, len(r.Notes[key]))
|
||||
copy(rn, r.Notes[key])
|
||||
r.NotesLock.Unlock()
|
||||
|
||||
for _, note := range rn {
|
||||
if err := stream.Send(note); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
52
test/routes/routes-server/handler/util.go
Normal file
52
test/routes/routes-server/handler/util.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
pb "github.com/micro/services/routes/proto"
|
||||
)
|
||||
|
||||
func toRadians(num float64) float64 {
|
||||
return num * math.Pi / float64(180)
|
||||
}
|
||||
|
||||
// calcDistance calculates the distance between two points using the "haversine" formula.
|
||||
// The formula is based on http://mathforum.org/library/drmath/view/51879.html.
|
||||
func calcDistance(p1 *pb.Point, p2 *pb.Point) int32 {
|
||||
const CordFactor float64 = 1e7
|
||||
const R = float64(6371000) // earth radius in metres
|
||||
lat1 := toRadians(float64(p1.Latitude) / CordFactor)
|
||||
lat2 := toRadians(float64(p2.Latitude) / CordFactor)
|
||||
lng1 := toRadians(float64(p1.Longitude) / CordFactor)
|
||||
lng2 := toRadians(float64(p2.Longitude) / CordFactor)
|
||||
dlat := lat2 - lat1
|
||||
dlng := lng2 - lng1
|
||||
|
||||
a := math.Sin(dlat/2)*math.Sin(dlat/2) +
|
||||
math.Cos(lat1)*math.Cos(lat2)*
|
||||
math.Sin(dlng/2)*math.Sin(dlng/2)
|
||||
c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))
|
||||
|
||||
distance := R * c
|
||||
return int32(distance)
|
||||
}
|
||||
|
||||
func inRange(point *pb.Point, rect *pb.Rectangle) bool {
|
||||
left := math.Min(float64(rect.Lo.Longitude), float64(rect.Hi.Longitude))
|
||||
right := math.Max(float64(rect.Lo.Longitude), float64(rect.Hi.Longitude))
|
||||
top := math.Max(float64(rect.Lo.Latitude), float64(rect.Hi.Latitude))
|
||||
bottom := math.Min(float64(rect.Lo.Latitude), float64(rect.Hi.Latitude))
|
||||
|
||||
if float64(point.Longitude) >= left &&
|
||||
float64(point.Longitude) <= right &&
|
||||
float64(point.Latitude) >= bottom &&
|
||||
float64(point.Latitude) <= top {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func serialize(point *pb.Point) string {
|
||||
return fmt.Sprintf("%d %d", point.Latitude, point.Longitude)
|
||||
}
|
||||
649
test/routes/routes-server/main.go
Normal file
649
test/routes/routes-server/main.go
Normal file
@@ -0,0 +1,649 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
|
||||
pb "github.com/micro/services/routes/proto"
|
||||
"github.com/micro/services/routes/routes-server/handler"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Create the service
|
||||
srv := service.New(
|
||||
service.Name("rpc"),
|
||||
service.Version("latest"),
|
||||
)
|
||||
|
||||
// Load the test data
|
||||
features, err := loadFeatures()
|
||||
if err != nil {
|
||||
logger.Fatalf("Error loading features: %v", err)
|
||||
}
|
||||
|
||||
// Register the handler
|
||||
pb.RegisterRouteGuideHandler(srv.Server(), &handler.RouteGuide{
|
||||
Features: features,
|
||||
Notes: make(map[string][]*pb.RouteNote),
|
||||
})
|
||||
|
||||
// Run the service
|
||||
if err := srv.Run(); err != nil {
|
||||
logger.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
// loadFeatures loads features from the JSON file.
|
||||
func loadFeatures() ([]*pb.Feature, error) {
|
||||
var result []*pb.Feature
|
||||
if err := json.Unmarshal(testData, &result); err != nil {
|
||||
return nil, fmt.Errorf("Failed to load default features: %v", err)
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
var testData = []byte(`[{
|
||||
"location": {
|
||||
"latitude": 407838351,
|
||||
"longitude": -746143763
|
||||
},
|
||||
"name": "Patriots Path, Mendham, NJ 07945, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 408122808,
|
||||
"longitude": -743999179
|
||||
},
|
||||
"name": "101 New Jersey 10, Whippany, NJ 07981, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 413628156,
|
||||
"longitude": -749015468
|
||||
},
|
||||
"name": "U.S. 6, Shohola, PA 18458, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 419999544,
|
||||
"longitude": -740371136
|
||||
},
|
||||
"name": "5 Conners Road, Kingston, NY 12401, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 414008389,
|
||||
"longitude": -743951297
|
||||
},
|
||||
"name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 419611318,
|
||||
"longitude": -746524769
|
||||
},
|
||||
"name": "287 Flugertown Road, Livingston Manor, NY 12758, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406109563,
|
||||
"longitude": -742186778
|
||||
},
|
||||
"name": "4001 Tremley Point Road, Linden, NJ 07036, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 416802456,
|
||||
"longitude": -742370183
|
||||
},
|
||||
"name": "352 South Mountain Road, Wallkill, NY 12589, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412950425,
|
||||
"longitude": -741077389
|
||||
},
|
||||
"name": "Bailey Turn Road, Harriman, NY 10926, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412144655,
|
||||
"longitude": -743949739
|
||||
},
|
||||
"name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 415736605,
|
||||
"longitude": -742847522
|
||||
},
|
||||
"name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 413843930,
|
||||
"longitude": -740501726
|
||||
},
|
||||
"name": "162 Merrill Road, Highland Mills, NY 10930, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 410873075,
|
||||
"longitude": -744459023
|
||||
},
|
||||
"name": "Clinton Road, West Milford, NJ 07480, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412346009,
|
||||
"longitude": -744026814
|
||||
},
|
||||
"name": "16 Old Brook Lane, Warwick, NY 10990, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 402948455,
|
||||
"longitude": -747903913
|
||||
},
|
||||
"name": "3 Drake Lane, Pennington, NJ 08534, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406337092,
|
||||
"longitude": -740122226
|
||||
},
|
||||
"name": "6324 8th Avenue, Brooklyn, NY 11220, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406421967,
|
||||
"longitude": -747727624
|
||||
},
|
||||
"name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 416318082,
|
||||
"longitude": -749677716
|
||||
},
|
||||
"name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 415301720,
|
||||
"longitude": -748416257
|
||||
},
|
||||
"name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 402647019,
|
||||
"longitude": -747071791
|
||||
},
|
||||
"name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412567807,
|
||||
"longitude": -741058078
|
||||
},
|
||||
"name": "New York State Reference Route 987E, Southfields, NY 10975, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 416855156,
|
||||
"longitude": -744420597
|
||||
},
|
||||
"name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404663628,
|
||||
"longitude": -744820157
|
||||
},
|
||||
"name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 407113723,
|
||||
"longitude": -749746483
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 402133926,
|
||||
"longitude": -743613249
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 400273442,
|
||||
"longitude": -741220915
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 411236786,
|
||||
"longitude": -744070769
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 411633782,
|
||||
"longitude": -746784970
|
||||
},
|
||||
"name": "211-225 Plains Road, Augusta, NJ 07822, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 415830701,
|
||||
"longitude": -742952812
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 413447164,
|
||||
"longitude": -748712898
|
||||
},
|
||||
"name": "165 Pedersen Ridge Road, Milford, PA 18337, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 405047245,
|
||||
"longitude": -749800722
|
||||
},
|
||||
"name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 418858923,
|
||||
"longitude": -746156790
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 417951888,
|
||||
"longitude": -748484944
|
||||
},
|
||||
"name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 407033786,
|
||||
"longitude": -743977337
|
||||
},
|
||||
"name": "26 East 3rd Street, New Providence, NJ 07974, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 417548014,
|
||||
"longitude": -740075041
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 410395868,
|
||||
"longitude": -744972325
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404615353,
|
||||
"longitude": -745129803
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406589790,
|
||||
"longitude": -743560121
|
||||
},
|
||||
"name": "611 Lawrence Avenue, Westfield, NJ 07090, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 414653148,
|
||||
"longitude": -740477477
|
||||
},
|
||||
"name": "18 Lannis Avenue, New Windsor, NY 12553, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 405957808,
|
||||
"longitude": -743255336
|
||||
},
|
||||
"name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 411733589,
|
||||
"longitude": -741648093
|
||||
},
|
||||
"name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412676291,
|
||||
"longitude": -742606606
|
||||
},
|
||||
"name": "1270 Lakes Road, Monroe, NY 10950, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 409224445,
|
||||
"longitude": -748286738
|
||||
},
|
||||
"name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406523420,
|
||||
"longitude": -742135517
|
||||
},
|
||||
"name": "652 Garden Street, Elizabeth, NJ 07202, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 401827388,
|
||||
"longitude": -740294537
|
||||
},
|
||||
"name": "349 Sea Spray Court, Neptune City, NJ 07753, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 410564152,
|
||||
"longitude": -743685054
|
||||
},
|
||||
"name": "13-17 Stanley Street, West Milford, NJ 07480, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 408472324,
|
||||
"longitude": -740726046
|
||||
},
|
||||
"name": "47 Industrial Avenue, Teterboro, NJ 07608, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412452168,
|
||||
"longitude": -740214052
|
||||
},
|
||||
"name": "5 White Oak Lane, Stony Point, NY 10980, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 409146138,
|
||||
"longitude": -746188906
|
||||
},
|
||||
"name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404701380,
|
||||
"longitude": -744781745
|
||||
},
|
||||
"name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 409642566,
|
||||
"longitude": -746017679
|
||||
},
|
||||
"name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 408031728,
|
||||
"longitude": -748645385
|
||||
},
|
||||
"name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 413700272,
|
||||
"longitude": -742135189
|
||||
},
|
||||
"name": "367 Prospect Road, Chester, NY 10918, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404310607,
|
||||
"longitude": -740282632
|
||||
},
|
||||
"name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 409319800,
|
||||
"longitude": -746201391
|
||||
},
|
||||
"name": "11 Ward Street, Mount Arlington, NJ 07856, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406685311,
|
||||
"longitude": -742108603
|
||||
},
|
||||
"name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 419018117,
|
||||
"longitude": -749142781
|
||||
},
|
||||
"name": "43 Dreher Road, Roscoe, NY 12776, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412856162,
|
||||
"longitude": -745148837
|
||||
},
|
||||
"name": "Swan Street, Pine Island, NY 10969, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 416560744,
|
||||
"longitude": -746721964
|
||||
},
|
||||
"name": "66 Pleasantview Avenue, Monticello, NY 12701, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 405314270,
|
||||
"longitude": -749836354
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 414219548,
|
||||
"longitude": -743327440
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 415534177,
|
||||
"longitude": -742900616
|
||||
},
|
||||
"name": "565 Winding Hills Road, Montgomery, NY 12549, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406898530,
|
||||
"longitude": -749127080
|
||||
},
|
||||
"name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 407586880,
|
||||
"longitude": -741670168
|
||||
},
|
||||
"name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 400106455,
|
||||
"longitude": -742870190
|
||||
},
|
||||
"name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 400066188,
|
||||
"longitude": -746793294
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 418803880,
|
||||
"longitude": -744102673
|
||||
},
|
||||
"name": "40 Mountain Road, Napanoch, NY 12458, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 414204288,
|
||||
"longitude": -747895140
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 414777405,
|
||||
"longitude": -740615601
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 415464475,
|
||||
"longitude": -747175374
|
||||
},
|
||||
"name": "48 North Road, Forestburgh, NY 12777, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404062378,
|
||||
"longitude": -746376177
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 405688272,
|
||||
"longitude": -749285130
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 400342070,
|
||||
"longitude": -748788996
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 401809022,
|
||||
"longitude": -744157964
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404226644,
|
||||
"longitude": -740517141
|
||||
},
|
||||
"name": "9 Thompson Avenue, Leonardo, NJ 07737, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 410322033,
|
||||
"longitude": -747871659
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 407100674,
|
||||
"longitude": -747742727
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 418811433,
|
||||
"longitude": -741718005
|
||||
},
|
||||
"name": "213 Bush Road, Stone Ridge, NY 12484, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 415034302,
|
||||
"longitude": -743850945
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 411349992,
|
||||
"longitude": -743694161
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404839914,
|
||||
"longitude": -744759616
|
||||
},
|
||||
"name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 414638017,
|
||||
"longitude": -745957854
|
||||
},
|
||||
"name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412127800,
|
||||
"longitude": -740173578
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 401263460,
|
||||
"longitude": -747964303
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 412843391,
|
||||
"longitude": -749086026
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 418512773,
|
||||
"longitude": -743067823
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404318328,
|
||||
"longitude": -740835638
|
||||
},
|
||||
"name": "42-102 Main Street, Belford, NJ 07718, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 419020746,
|
||||
"longitude": -741172328
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404080723,
|
||||
"longitude": -746119569
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 401012643,
|
||||
"longitude": -744035134
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 404306372,
|
||||
"longitude": -741079661
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 403966326,
|
||||
"longitude": -748519297
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 405002031,
|
||||
"longitude": -748407866
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 409532885,
|
||||
"longitude": -742200683
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 416851321,
|
||||
"longitude": -742674555
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 406411633,
|
||||
"longitude": -741722051
|
||||
},
|
||||
"name": "3387 Richmond Terrace, Staten Island, NY 10303, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 413069058,
|
||||
"longitude": -744597778
|
||||
},
|
||||
"name": "261 Van Sickle Road, Goshen, NY 10924, USA"
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 418465462,
|
||||
"longitude": -746859398
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 411733222,
|
||||
"longitude": -744228360
|
||||
},
|
||||
"name": ""
|
||||
}, {
|
||||
"location": {
|
||||
"latitude": 410248224,
|
||||
"longitude": -747127767
|
||||
},
|
||||
"name": "3 Hasta Way, Newton, NJ 07860, USA"
|
||||
}]`)
|
||||
0
test/template/.gitignore
vendored
Normal file
0
test/template/.gitignore
vendored
Normal file
3
test/template/Dockerfile
Normal file
3
test/template/Dockerfile
Normal file
@@ -0,0 +1,3 @@
|
||||
FROM alpine
|
||||
ADD idiomatic /idiomatic
|
||||
ENTRYPOINT [ "/idiomatic" ]
|
||||
17
test/template/Makefile
Normal file
17
test/template/Makefile
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
GOPATH:=$(shell go env GOPATH)
|
||||
.PHONY: proto
|
||||
proto:
|
||||
protoc --proto_path=. --micro_out=. --go_out=:. proto/idiomatic.proto
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
go build -o idiomatic *.go
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
go test -v ./... -cover
|
||||
|
||||
.PHONY: docker
|
||||
docker:
|
||||
docker build . -t idiomatic:latest
|
||||
53
test/template/README.md
Normal file
53
test/template/README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# Template Service
|
||||
|
||||
This is an example of a service template
|
||||
|
||||
Generated with
|
||||
|
||||
```
|
||||
micro new template
|
||||
```
|
||||
|
||||
## Getting Started
|
||||
|
||||
- [Configuration](#configuration)
|
||||
- [Dependencies](#dependencies)
|
||||
- [Usage](#usage)
|
||||
|
||||
## Configuration
|
||||
|
||||
- Alias: template
|
||||
|
||||
## Dependencies
|
||||
|
||||
Micro services depend on service discovery. The default is multicast DNS, a zeroconf system.
|
||||
|
||||
In the event you need a resilient multi-host setup we recommend etcd.
|
||||
|
||||
```
|
||||
# install etcd
|
||||
brew install etcd
|
||||
|
||||
# run etcd
|
||||
etcd
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
A Makefile is included for convenience
|
||||
|
||||
Build the binary
|
||||
|
||||
```
|
||||
make build
|
||||
```
|
||||
|
||||
Run the service
|
||||
```
|
||||
./template
|
||||
```
|
||||
|
||||
Build a docker image
|
||||
```
|
||||
make docker
|
||||
```
|
||||
24
test/template/cmd/template/main.go
Normal file
24
test/template/cmd/template/main.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/micro/services/template/handler"
|
||||
|
||||
"github.com/micro/micro/v3/service"
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Create service
|
||||
srv := service.New(
|
||||
service.Name("idiomatic"),
|
||||
service.Version("latest"),
|
||||
)
|
||||
|
||||
// Register handler
|
||||
srv.Handle(new(handler.Idiomatic))
|
||||
|
||||
// Run service
|
||||
if err := srv.Run(); err != nil {
|
||||
logger.Fatal(err)
|
||||
}
|
||||
}
|
||||
2
test/template/generate.go
Normal file
2
test/template/generate.go
Normal file
@@ -0,0 +1,2 @@
|
||||
package main
|
||||
//go:generate make proto
|
||||
48
test/template/handler/idiomatic.go
Normal file
48
test/template/handler/idiomatic.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
log "github.com/micro/micro/v3/service/logger"
|
||||
|
||||
idiomatic "github.com/micro/services/template/proto"
|
||||
)
|
||||
|
||||
type Idiomatic struct{}
|
||||
|
||||
// Call is a single request handler called via client.Call or the generated client code
|
||||
func (e *Idiomatic) Call(ctx context.Context, req *idiomatic.Request, rsp *idiomatic.Response) error {
|
||||
log.Info("Received Idiomatic.Call request")
|
||||
rsp.Msg = "Hello " + req.Name
|
||||
return nil
|
||||
}
|
||||
|
||||
// Stream is a server side stream handler called via client.Stream or the generated client code
|
||||
func (e *Idiomatic) Stream(ctx context.Context, req *idiomatic.StreamingRequest, stream idiomatic.Idiomatic_StreamStream) error {
|
||||
log.Infof("Received Idiomatic.Stream request with count: %d", req.Count)
|
||||
|
||||
for i := 0; i < int(req.Count); i++ {
|
||||
log.Infof("Responding: %d", i)
|
||||
if err := stream.Send(&idiomatic.StreamingResponse{
|
||||
Count: int64(i),
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// PingPong is a bidirectional stream handler called via client.Stream or the generated client code
|
||||
func (e *Idiomatic) PingPong(ctx context.Context, stream idiomatic.Idiomatic_PingPongStream) error {
|
||||
for {
|
||||
req, err := stream.Recv()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Got ping %v", req.Stroke)
|
||||
if err := stream.Send(&idiomatic.Pong{Stroke: req.Stroke}); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
327
test/template/proto/idiomatic.pb.go
Normal file
327
test/template/proto/idiomatic.pb.go
Normal file
@@ -0,0 +1,327 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: proto/idiomatic.proto
|
||||
|
||||
package idiomatic
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
type Message struct {
|
||||
Say string `protobuf:"bytes,1,opt,name=say,proto3" json:"say,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Message) Reset() { *m = Message{} }
|
||||
func (m *Message) String() string { return proto.CompactTextString(m) }
|
||||
func (*Message) ProtoMessage() {}
|
||||
func (*Message) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_70718d389c4b1652, []int{0}
|
||||
}
|
||||
|
||||
func (m *Message) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Message.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Message.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Message) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Message.Merge(m, src)
|
||||
}
|
||||
func (m *Message) XXX_Size() int {
|
||||
return xxx_messageInfo_Message.Size(m)
|
||||
}
|
||||
func (m *Message) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Message.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Message proto.InternalMessageInfo
|
||||
|
||||
func (m *Message) GetSay() string {
|
||||
if m != nil {
|
||||
return m.Say
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type Request struct {
|
||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Request) Reset() { *m = Request{} }
|
||||
func (m *Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*Request) ProtoMessage() {}
|
||||
func (*Request) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_70718d389c4b1652, []int{1}
|
||||
}
|
||||
|
||||
func (m *Request) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Request.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Request.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Request) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Request.Merge(m, src)
|
||||
}
|
||||
func (m *Request) XXX_Size() int {
|
||||
return xxx_messageInfo_Request.Size(m)
|
||||
}
|
||||
func (m *Request) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Request.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Request proto.InternalMessageInfo
|
||||
|
||||
func (m *Request) GetName() string {
|
||||
if m != nil {
|
||||
return m.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Response) Reset() { *m = Response{} }
|
||||
func (m *Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*Response) ProtoMessage() {}
|
||||
func (*Response) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_70718d389c4b1652, []int{2}
|
||||
}
|
||||
|
||||
func (m *Response) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Response.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Response.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Response) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Response.Merge(m, src)
|
||||
}
|
||||
func (m *Response) XXX_Size() int {
|
||||
return xxx_messageInfo_Response.Size(m)
|
||||
}
|
||||
func (m *Response) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Response.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Response proto.InternalMessageInfo
|
||||
|
||||
func (m *Response) GetMsg() string {
|
||||
if m != nil {
|
||||
return m.Msg
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type StreamingRequest struct {
|
||||
Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *StreamingRequest) Reset() { *m = StreamingRequest{} }
|
||||
func (m *StreamingRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingRequest) ProtoMessage() {}
|
||||
func (*StreamingRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_70718d389c4b1652, []int{3}
|
||||
}
|
||||
|
||||
func (m *StreamingRequest) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_StreamingRequest.Unmarshal(m, b)
|
||||
}
|
||||
func (m *StreamingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_StreamingRequest.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *StreamingRequest) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_StreamingRequest.Merge(m, src)
|
||||
}
|
||||
func (m *StreamingRequest) XXX_Size() int {
|
||||
return xxx_messageInfo_StreamingRequest.Size(m)
|
||||
}
|
||||
func (m *StreamingRequest) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_StreamingRequest.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_StreamingRequest proto.InternalMessageInfo
|
||||
|
||||
func (m *StreamingRequest) GetCount() int64 {
|
||||
if m != nil {
|
||||
return m.Count
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type StreamingResponse struct {
|
||||
Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *StreamingResponse) Reset() { *m = StreamingResponse{} }
|
||||
func (m *StreamingResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingResponse) ProtoMessage() {}
|
||||
func (*StreamingResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_70718d389c4b1652, []int{4}
|
||||
}
|
||||
|
||||
func (m *StreamingResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_StreamingResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *StreamingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_StreamingResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *StreamingResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_StreamingResponse.Merge(m, src)
|
||||
}
|
||||
func (m *StreamingResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_StreamingResponse.Size(m)
|
||||
}
|
||||
func (m *StreamingResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_StreamingResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_StreamingResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *StreamingResponse) GetCount() int64 {
|
||||
if m != nil {
|
||||
return m.Count
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type Ping struct {
|
||||
Stroke int64 `protobuf:"varint,1,opt,name=stroke,proto3" json:"stroke,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Ping) Reset() { *m = Ping{} }
|
||||
func (m *Ping) String() string { return proto.CompactTextString(m) }
|
||||
func (*Ping) ProtoMessage() {}
|
||||
func (*Ping) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_70718d389c4b1652, []int{5}
|
||||
}
|
||||
|
||||
func (m *Ping) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Ping.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Ping.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Ping) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Ping.Merge(m, src)
|
||||
}
|
||||
func (m *Ping) XXX_Size() int {
|
||||
return xxx_messageInfo_Ping.Size(m)
|
||||
}
|
||||
func (m *Ping) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Ping.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Ping proto.InternalMessageInfo
|
||||
|
||||
func (m *Ping) GetStroke() int64 {
|
||||
if m != nil {
|
||||
return m.Stroke
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type Pong struct {
|
||||
Stroke int64 `protobuf:"varint,1,opt,name=stroke,proto3" json:"stroke,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Pong) Reset() { *m = Pong{} }
|
||||
func (m *Pong) String() string { return proto.CompactTextString(m) }
|
||||
func (*Pong) ProtoMessage() {}
|
||||
func (*Pong) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_70718d389c4b1652, []int{6}
|
||||
}
|
||||
|
||||
func (m *Pong) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Pong.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Pong) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Pong.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Pong) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Pong.Merge(m, src)
|
||||
}
|
||||
func (m *Pong) XXX_Size() int {
|
||||
return xxx_messageInfo_Pong.Size(m)
|
||||
}
|
||||
func (m *Pong) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Pong.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Pong proto.InternalMessageInfo
|
||||
|
||||
func (m *Pong) GetStroke() int64 {
|
||||
if m != nil {
|
||||
return m.Stroke
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*Message)(nil), "idiomatic.Message")
|
||||
proto.RegisterType((*Request)(nil), "idiomatic.Request")
|
||||
proto.RegisterType((*Response)(nil), "idiomatic.Response")
|
||||
proto.RegisterType((*StreamingRequest)(nil), "idiomatic.StreamingRequest")
|
||||
proto.RegisterType((*StreamingResponse)(nil), "idiomatic.StreamingResponse")
|
||||
proto.RegisterType((*Ping)(nil), "idiomatic.Ping")
|
||||
proto.RegisterType((*Pong)(nil), "idiomatic.Pong")
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("proto/idiomatic.proto", fileDescriptor_70718d389c4b1652) }
|
||||
|
||||
var fileDescriptor_70718d389c4b1652 = []byte{
|
||||
// 270 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0x3f, 0x4f, 0xc3, 0x30,
|
||||
0x10, 0xc5, 0x6b, 0xb5, 0xa4, 0xcd, 0x2d, 0x6d, 0x8f, 0x3f, 0x42, 0x69, 0x41, 0xc8, 0x53, 0x58,
|
||||
0x4a, 0x29, 0x23, 0x1b, 0x0c, 0x88, 0x01, 0x09, 0x85, 0x8d, 0xcd, 0x14, 0xcb, 0xb2, 0xa8, 0xed,
|
||||
0x92, 0x73, 0x07, 0x3e, 0x1b, 0x5f, 0x0e, 0xc5, 0x71, 0x4a, 0x8a, 0xca, 0x76, 0xf7, 0x7e, 0xef,
|
||||
0x4e, 0xef, 0x6c, 0x38, 0x5e, 0x97, 0xce, 0xbb, 0x2b, 0xfd, 0xae, 0x9d, 0x11, 0x5e, 0x2f, 0x67,
|
||||
0xa1, 0xc7, 0x74, 0x2b, 0xf0, 0x09, 0xf4, 0x9f, 0x24, 0x91, 0x50, 0x12, 0x47, 0xd0, 0x25, 0xf1,
|
||||
0x75, 0xca, 0x2e, 0x58, 0x9e, 0x16, 0x55, 0xc9, 0xcf, 0xa0, 0x5f, 0xc8, 0xcf, 0x8d, 0x24, 0x8f,
|
||||
0x08, 0x3d, 0x2b, 0x8c, 0x8c, 0x34, 0xd4, 0x7c, 0x0a, 0x83, 0x42, 0xd2, 0xda, 0x59, 0x0a, 0xc3,
|
||||
0x86, 0x54, 0x33, 0x6c, 0x48, 0xf1, 0x1c, 0x46, 0x2f, 0xbe, 0x94, 0xc2, 0x68, 0xab, 0x9a, 0x2d,
|
||||
0x47, 0x70, 0xb0, 0x74, 0x1b, 0xeb, 0x83, 0xaf, 0x5b, 0xd4, 0x0d, 0xbf, 0x84, 0x71, 0xcb, 0x19,
|
||||
0x17, 0xee, 0xb7, 0x9e, 0x43, 0xef, 0x59, 0x5b, 0x85, 0x27, 0x90, 0x90, 0x2f, 0xdd, 0x87, 0x8c,
|
||||
0x38, 0x76, 0x81, 0xbb, 0xff, 0xf9, 0xe2, 0x9b, 0x41, 0xfa, 0xd8, 0x1c, 0x8f, 0xd7, 0xd0, 0xbb,
|
||||
0x17, 0xab, 0x15, 0xe2, 0xec, 0xf7, 0x85, 0x62, 0xd4, 0xec, 0x70, 0x47, 0xab, 0x43, 0xf1, 0x0e,
|
||||
0x3e, 0x40, 0x52, 0x67, 0xc5, 0x49, 0xcb, 0xf0, 0xf7, 0xd0, 0x6c, 0xba, 0x1f, 0x36, 0x6b, 0xe6,
|
||||
0x0c, 0x17, 0x30, 0xa8, 0x2e, 0x09, 0x69, 0x87, 0x2d, 0x77, 0x25, 0x66, 0x3b, 0x82, 0xb3, 0x8a,
|
||||
0x77, 0x72, 0x36, 0x67, 0x77, 0xe3, 0xd7, 0x61, 0xf8, 0xc0, 0xdb, 0x2d, 0x7d, 0x4b, 0x82, 0x70,
|
||||
0xf3, 0x13, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xd7, 0xdf, 0x69, 0xea, 0x01, 0x00, 0x00,
|
||||
}
|
||||
284
test/template/proto/idiomatic.pb.micro.go
Normal file
284
test/template/proto/idiomatic.pb.micro.go
Normal file
@@ -0,0 +1,284 @@
|
||||
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||
// source: proto/idiomatic.proto
|
||||
|
||||
package idiomatic
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
import (
|
||||
context "context"
|
||||
api "github.com/micro/go-micro/v3/api"
|
||||
client "github.com/micro/go-micro/v3/client"
|
||||
server "github.com/micro/go-micro/v3/server"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ api.Endpoint
|
||||
var _ context.Context
|
||||
var _ client.Option
|
||||
var _ server.Option
|
||||
|
||||
// Api Endpoints for Idiomatic service
|
||||
|
||||
func NewIdiomaticEndpoints() []*api.Endpoint {
|
||||
return []*api.Endpoint{}
|
||||
}
|
||||
|
||||
// Client API for Idiomatic service
|
||||
|
||||
type IdiomaticService interface {
|
||||
Call(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
Stream(ctx context.Context, in *StreamingRequest, opts ...client.CallOption) (Idiomatic_StreamService, error)
|
||||
PingPong(ctx context.Context, opts ...client.CallOption) (Idiomatic_PingPongService, error)
|
||||
}
|
||||
|
||||
type idiomaticService struct {
|
||||
c client.Client
|
||||
name string
|
||||
}
|
||||
|
||||
func NewIdiomaticService(name string, c client.Client) IdiomaticService {
|
||||
return &idiomaticService{
|
||||
c: c,
|
||||
name: name,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *idiomaticService) Call(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
|
||||
req := c.c.NewRequest(c.name, "Idiomatic.Call", in)
|
||||
out := new(Response)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *idiomaticService) Stream(ctx context.Context, in *StreamingRequest, opts ...client.CallOption) (Idiomatic_StreamService, error) {
|
||||
req := c.c.NewRequest(c.name, "Idiomatic.Stream", &StreamingRequest{})
|
||||
stream, err := c.c.Stream(ctx, req, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := stream.Send(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &idiomaticServiceStream{stream}, nil
|
||||
}
|
||||
|
||||
type Idiomatic_StreamService interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Recv() (*StreamingResponse, error)
|
||||
}
|
||||
|
||||
type idiomaticServiceStream struct {
|
||||
stream client.Stream
|
||||
}
|
||||
|
||||
func (x *idiomaticServiceStream) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *idiomaticServiceStream) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *idiomaticServiceStream) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticServiceStream) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticServiceStream) Recv() (*StreamingResponse, error) {
|
||||
m := new(StreamingResponse)
|
||||
err := x.stream.Recv(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func (c *idiomaticService) PingPong(ctx context.Context, opts ...client.CallOption) (Idiomatic_PingPongService, error) {
|
||||
req := c.c.NewRequest(c.name, "Idiomatic.PingPong", &Ping{})
|
||||
stream, err := c.c.Stream(ctx, req, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &idiomaticServicePingPong{stream}, nil
|
||||
}
|
||||
|
||||
type Idiomatic_PingPongService interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Send(*Ping) error
|
||||
Recv() (*Pong, error)
|
||||
}
|
||||
|
||||
type idiomaticServicePingPong struct {
|
||||
stream client.Stream
|
||||
}
|
||||
|
||||
func (x *idiomaticServicePingPong) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *idiomaticServicePingPong) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *idiomaticServicePingPong) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticServicePingPong) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticServicePingPong) Send(m *Ping) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticServicePingPong) Recv() (*Pong, error) {
|
||||
m := new(Pong)
|
||||
err := x.stream.Recv(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// Server API for Idiomatic service
|
||||
|
||||
type IdiomaticHandler interface {
|
||||
Call(context.Context, *Request, *Response) error
|
||||
Stream(context.Context, *StreamingRequest, Idiomatic_StreamStream) error
|
||||
PingPong(context.Context, Idiomatic_PingPongStream) error
|
||||
}
|
||||
|
||||
func RegisterIdiomaticHandler(s server.Server, hdlr IdiomaticHandler, opts ...server.HandlerOption) error {
|
||||
type idiomatic interface {
|
||||
Call(ctx context.Context, in *Request, out *Response) error
|
||||
Stream(ctx context.Context, stream server.Stream) error
|
||||
PingPong(ctx context.Context, stream server.Stream) error
|
||||
}
|
||||
type Idiomatic struct {
|
||||
idiomatic
|
||||
}
|
||||
h := &idiomaticHandler{hdlr}
|
||||
return s.Handle(s.NewHandler(&Idiomatic{h}, opts...))
|
||||
}
|
||||
|
||||
type idiomaticHandler struct {
|
||||
IdiomaticHandler
|
||||
}
|
||||
|
||||
func (h *idiomaticHandler) Call(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.IdiomaticHandler.Call(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *idiomaticHandler) Stream(ctx context.Context, stream server.Stream) error {
|
||||
m := new(StreamingRequest)
|
||||
if err := stream.Recv(m); err != nil {
|
||||
return err
|
||||
}
|
||||
return h.IdiomaticHandler.Stream(ctx, m, &idiomaticStreamStream{stream})
|
||||
}
|
||||
|
||||
type Idiomatic_StreamStream interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Send(*StreamingResponse) error
|
||||
}
|
||||
|
||||
type idiomaticStreamStream struct {
|
||||
stream server.Stream
|
||||
}
|
||||
|
||||
func (x *idiomaticStreamStream) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *idiomaticStreamStream) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *idiomaticStreamStream) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticStreamStream) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticStreamStream) Send(m *StreamingResponse) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (h *idiomaticHandler) PingPong(ctx context.Context, stream server.Stream) error {
|
||||
return h.IdiomaticHandler.PingPong(ctx, &idiomaticPingPongStream{stream})
|
||||
}
|
||||
|
||||
type Idiomatic_PingPongStream interface {
|
||||
Context() context.Context
|
||||
SendMsg(interface{}) error
|
||||
RecvMsg(interface{}) error
|
||||
Close() error
|
||||
Send(*Pong) error
|
||||
Recv() (*Ping, error)
|
||||
}
|
||||
|
||||
type idiomaticPingPongStream struct {
|
||||
stream server.Stream
|
||||
}
|
||||
|
||||
func (x *idiomaticPingPongStream) Close() error {
|
||||
return x.stream.Close()
|
||||
}
|
||||
|
||||
func (x *idiomaticPingPongStream) Context() context.Context {
|
||||
return x.stream.Context()
|
||||
}
|
||||
|
||||
func (x *idiomaticPingPongStream) SendMsg(m interface{}) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticPingPongStream) RecvMsg(m interface{}) error {
|
||||
return x.stream.Recv(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticPingPongStream) Send(m *Pong) error {
|
||||
return x.stream.Send(m)
|
||||
}
|
||||
|
||||
func (x *idiomaticPingPongStream) Recv() (*Ping, error) {
|
||||
m := new(Ping)
|
||||
if err := x.stream.Recv(m); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
39
test/template/proto/idiomatic.proto
Normal file
39
test/template/proto/idiomatic.proto
Normal file
@@ -0,0 +1,39 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package idiomatic;
|
||||
|
||||
option go_package = "proto;idiomatic";
|
||||
|
||||
service Idiomatic {
|
||||
rpc Call(Request) returns (Response) {}
|
||||
rpc Stream(StreamingRequest) returns (stream StreamingResponse) {}
|
||||
rpc PingPong(stream Ping) returns (stream Pong) {}
|
||||
}
|
||||
|
||||
message Message {
|
||||
string say = 1;
|
||||
}
|
||||
|
||||
message Request {
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
message Response {
|
||||
string msg = 1;
|
||||
}
|
||||
|
||||
message StreamingRequest {
|
||||
int64 count = 1;
|
||||
}
|
||||
|
||||
message StreamingResponse {
|
||||
int64 count = 1;
|
||||
}
|
||||
|
||||
message Ping {
|
||||
int64 stroke = 1;
|
||||
}
|
||||
|
||||
message Pong {
|
||||
int64 stroke = 1;
|
||||
}
|
||||
Reference in New Issue
Block a user