From d119807d1c9bbfe86f64b1aa8d3d4ae28abecf94 Mon Sep 17 00:00:00 2001 From: Asim Aslam Date: Mon, 26 Apr 2021 11:42:08 +0100 Subject: [PATCH] add osrm to routing service (#86) --- go.mod | 2 + go.sum | 8 + routing/README.md | 8 + routing/handler/{handler.go => google.go} | 21 +- .../{handler_test.go => google_test.go} | 79 ++++--- routing/handler/osrm.go | 77 +++++++ routing/main.go | 50 +++- routing/proto/routing.pb.go | 216 ++++++++++++------ routing/proto/routing.pb.micro.go | 1 - routing/proto/routing.proto | 18 +- 10 files changed, 345 insertions(+), 135 deletions(-) rename routing/handler/{handler.go => google.go} (79%) rename routing/handler/{handler_test.go => google_test.go} (65%) create mode 100644 routing/handler/osrm.go diff --git a/go.mod b/go.mod index 88a97f9..21efb5e 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/PuerkitoBio/goquery v1.6.1 github.com/SlyMarbo/rss v1.0.1 github.com/getkin/kin-openapi v0.26.0 + github.com/gojuno/go.osrm v0.1.1-0.20200217151037-435fc3e1d3d4 github.com/golang/protobuf v1.5.1 github.com/google/uuid v1.1.2 github.com/gosimple/slug v1.9.0 @@ -16,6 +17,7 @@ require ( github.com/micro/micro/v3 v3.2.1-0.20210416134206-20d3a6b03014 github.com/miekg/dns v1.1.31 // indirect github.com/nats-io/nats-streaming-server v0.21.1 + github.com/paulmach/go.geo v0.0.0-20180829195134-22b514266d33 github.com/stoewer/go-strcase v1.2.0 github.com/stretchr/testify v1.6.1 github.com/ulikunitz/xz v0.5.8 // indirect diff --git a/go.sum b/go.sum index 2a19fe1..2fc8c38 100644 --- a/go.sum +++ b/go.sum @@ -159,6 +159,10 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/gojuno/go.osrm v0.1.0 h1:M9RH1raBe7D72preWxFOw9WafGftGBQyoGNkG6upAT0= +github.com/gojuno/go.osrm v0.1.0/go.mod h1:XPCHB/Ir2/vHnqhKlfUxIiUGHFtTzgrRxD89JdkJhrs= +github.com/gojuno/go.osrm v0.1.1-0.20200217151037-435fc3e1d3d4 h1:ZhyiVDRMAdbMPFmzJMAK3GVbUG5abPRUMC9jySXcfCU= +github.com/gojuno/go.osrm v0.1.1-0.20200217151037-435fc3e1d3d4/go.mod h1:XPCHB/Ir2/vHnqhKlfUxIiUGHFtTzgrRxD89JdkJhrs= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -456,6 +460,10 @@ github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwU github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/paulmach/go.geo v0.0.0-20180829195134-22b514266d33 h1:doG/0aLlWE6E4ndyQlkAQrPwaojghwz1IlmH0kjTdyk= +github.com/paulmach/go.geo v0.0.0-20180829195134-22b514266d33/go.mod h1:btFYk/ltlMU7ZKguHS7zQrwHYCtLoXGTaa44OsPbEVw= +github.com/paulmach/go.geojson v1.4.0 h1:5x5moCkCtDo5x8af62P9IOAYGQcYHtxz2QJ3x1DoCgY= +github.com/paulmach/go.geojson v1.4.0/go.mod h1:YaKx1hKpWF+T2oj2lFJPsW/t1Q5e1jQI61eoQSTwpIs= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/routing/README.md b/routing/README.md index ad44ff3..cba695d 100644 --- a/routing/README.md +++ b/routing/README.md @@ -3,3 +3,11 @@ Point to point routing directions # Routing Service The routing service provides point to point directions + +## Config + +The following config must be set + +- **routing.mode**: "google" or "osrm" +- **google.api.key**: google maps api key if using google +- **osrm.api.address"**: location of osrm api diff --git a/routing/handler/handler.go b/routing/handler/google.go similarity index 79% rename from routing/handler/handler.go rename to routing/handler/google.go index 9720f9b..ac856ae 100644 --- a/routing/handler/handler.go +++ b/routing/handler/google.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "google.golang.org/protobuf/types/known/wrapperspb" "googlemaps.github.io/maps" "github.com/micro/micro/v3/service/errors" @@ -21,11 +20,11 @@ var ( ErrNoRoutes = errors.BadRequest("NO_ROUTES", "No routes found") ) -type Routing struct { +type Google struct { Maps *maps.Client } -func (r *Routing) Route(ctx context.Context, req *pb.RouteRequest, rsp *pb.RouteResponse) error { +func (r *Google) Route(ctx context.Context, req *pb.RouteRequest, rsp *pb.RouteResponse) error { // validate the request if req.Origin == nil { return ErrMissingOrigin @@ -60,26 +59,28 @@ func (r *Routing) Route(ctx context.Context, req *pb.RouteRequest, rsp *pb.Route } // return the result - rsp.Waypoints = make([]*pb.Point, len(points)) + rsp.Waypoints = make([]*pb.Waypoint, len(points)) for i, p := range points { - rsp.Waypoints[i] = &pb.Point{ - Latitude: &wrapperspb.DoubleValue{Value: p.Lat}, - Longitude: &wrapperspb.DoubleValue{Value: p.Lng}, + rsp.Waypoints[i] = &pb.Waypoint{ + Location: &pb.Point{ + Latitude: p.Lat, + Longitude: p.Lng, + }, } } return nil } func validatePoint(p *pb.Point) error { - if p.Latitude == nil { + if p.Latitude == 0.0 { return ErrMissingLatitude } - if p.Longitude == nil { + if p.Longitude == 0.0 { return ErrMissingLongitude } return nil } func pointToString(p *pb.Point) string { - return fmt.Sprintf("%v,%v", p.Latitude.Value, p.Longitude.Value) + return fmt.Sprintf("%v,%v", p.Latitude, p.Longitude) } diff --git a/routing/handler/handler_test.go b/routing/handler/google_test.go similarity index 65% rename from routing/handler/handler_test.go rename to routing/handler/google_test.go index c5ee96f..e6afbd5 100644 --- a/routing/handler/handler_test.go +++ b/routing/handler/google_test.go @@ -11,7 +11,6 @@ import ( "github.com/micro/services/routing/handler" pb "github.com/micro/services/routing/proto" "github.com/stretchr/testify/assert" - "google.golang.org/protobuf/types/known/wrapperspb" "googlemaps.github.io/maps" ) @@ -116,13 +115,13 @@ func TestRoute(t *testing.T) { if err != nil { t.Fatal(err) } - h := &handler.Routing{Maps: m} + h := &handler.Google{Maps: m} - originLat := &wrapperspb.DoubleValue{Value: 33.8688} - originLng := &wrapperspb.DoubleValue{Value: 151.2093} + originLat := 33.8688 + originLng := 151.2093 - destinationLat := &wrapperspb.DoubleValue{Value: 33.8136} - destinationLng := &wrapperspb.DoubleValue{Value: 151.0034} + destinationLat := 33.8136 + destinationLng := 151.0034 tt := []struct { Name string @@ -159,52 +158,52 @@ func TestRoute(t *testing.T) { Destination: &pb.Point{Latitude: destinationLat, Longitude: destinationLng}, Result: []*pb.Point{ { - Latitude: &wrapperspb.DoubleValue{Value: -33.867490000000004}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20708000000002}, + Latitude: -33.867490000000004, + Longitude: 151.20708000000002, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.867610000000006}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20707000000002}, + Latitude: -33.867610000000006, + Longitude: 151.20707000000002, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.868080000000006}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20702}, + Latitude: -33.868080000000006, + Longitude: 151.20702, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.868390000000005}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20699000000002}, + Latitude: -33.868390000000005, + Longitude: 151.20699000000002, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.86874}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20697}, + Latitude: -33.86874, + Longitude: 151.20697, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.869400000000006}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20696}, + Latitude: -33.869400000000006, + Longitude: 151.20696, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.86941}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20696}, + Latitude: -33.86941, + Longitude: 151.20696, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.86957}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20695}, + Latitude: -33.86957, + Longitude: 151.20695, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.86965}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20695}, + Latitude: -33.86965, + Longitude: 151.20695, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.87059}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20694}, + Latitude: -33.87059, + Longitude: 151.20694, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.870740000000005}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20694}, + Latitude: -33.870740000000005, + Longitude: 151.20694, }, { - Latitude: &wrapperspb.DoubleValue{Value: -33.87078}, - Longitude: &wrapperspb.DoubleValue{Value: 151.20693}, + Latitude: -33.87078, + Longitude: 151.20693, }, }, }, @@ -223,17 +222,17 @@ func TestRoute(t *testing.T) { } // check the right info was sent to google maps - if tc.Origin != nil && tc.Origin.Latitude != nil { - assert.Equal(t, fmt.Sprintf("%v", tc.Origin.Latitude.Value), oLat) + if tc.Origin != nil && tc.Origin.Latitude != 0.0 { + assert.Equal(t, fmt.Sprintf("%v", tc.Origin.Latitude), oLat) } - if tc.Origin != nil && tc.Origin.Longitude != nil { - assert.Equal(t, fmt.Sprintf("%v", tc.Origin.Longitude.Value), oLng) + if tc.Origin != nil && tc.Origin.Longitude != 0.0 { + assert.Equal(t, fmt.Sprintf("%v", tc.Origin.Longitude), oLng) } - if tc.Destination != nil && tc.Destination.Latitude != nil { - assert.Equal(t, fmt.Sprintf("%v", tc.Destination.Latitude.Value), dLat) + if tc.Destination != nil && tc.Destination.Latitude != 0.0 { + assert.Equal(t, fmt.Sprintf("%v", tc.Destination.Latitude), dLat) } - if tc.Destination != nil && tc.Destination.Longitude != nil { - assert.Equal(t, fmt.Sprintf("%v", tc.Destination.Longitude.Value), dLng) + if tc.Destination != nil && tc.Destination.Longitude != 0.0 { + assert.Equal(t, fmt.Sprintf("%v", tc.Destination.Longitude), dLng) } // check the response is correct @@ -242,8 +241,8 @@ func TestRoute(t *testing.T) { } for i, p := range tc.Result { w := rsp.Waypoints[i] - assert.Equal(t, p.Latitude.Value, w.Latitude.Value) - assert.Equal(t, p.Longitude.Value, w.Longitude.Value) + assert.Equal(t, p.Latitude, w.Location.Latitude) + assert.Equal(t, p.Longitude, w.Location.Longitude) } }) } diff --git a/routing/handler/osrm.go b/routing/handler/osrm.go new file mode 100644 index 0000000..7e47d29 --- /dev/null +++ b/routing/handler/osrm.go @@ -0,0 +1,77 @@ +package handler + +import ( + "context" + "net/url" + "time" + + "github.com/gojuno/go.osrm" + "github.com/micro/micro/v3/service/errors" + pb "github.com/micro/services/routing/proto" + "github.com/paulmach/go.geo" +) + +type OSRM struct { + // api address + Address string + // osrm client + Client *osrm.OSRM +} + +func (o *OSRM) Route(ctx context.Context, req *pb.RouteRequest, rsp *pb.RouteResponse) error { + // validate the request + if req.Origin == nil { + return ErrMissingOrigin + } + if req.Destination == nil { + return ErrMissingDestination + } + if err := validatePoint(req.Origin); err != nil { + return err + } + if err := validatePoint(req.Destination); err != nil { + return err + } + + if o.Client == nil { + u, _ := url.Parse(o.Address) + if u.Scheme == "" { + u.Scheme = "http" + } + o.Client = osrm.NewFromURL(u.String()) + } + + ctx, cancelFn := context.WithTimeout(context.Background(), time.Second) + defer cancelFn() + + orig := req.Origin + dest := req.Destination + + resp, err := o.Client.Route(ctx, osrm.RouteRequest{ + Profile: "car", + Coordinates: osrm.NewGeometryFromPointSet(geo.PointSet{ + {orig.Longitude, orig.Latitude}, + {dest.Longitude, dest.Latitude}, + }), + Steps: osrm.StepsTrue, + Annotations: osrm.AnnotationsTrue, + Overview: osrm.OverviewFalse, + Geometries: osrm.GeometriesPolyline6, + }) + if err != nil { + return errors.InternalServerError("routing.route", "failed to get route: %v", err.Error()) + } + + for _, waypoint := range resp.Waypoints { + rsp.Waypoints = append(rsp.Waypoints, &pb.Waypoint{ + Name: waypoint.Name, + Distance: float64(waypoint.Distance), + Location: &pb.Point{ + Latitude: waypoint.Location.Lat(), + Longitude: waypoint.Location.Lng(), + }, + }) + } + + return nil +} diff --git a/routing/main.go b/routing/main.go index 78d03c1..f66e4e4 100644 --- a/routing/main.go +++ b/routing/main.go @@ -17,22 +17,48 @@ func main() { service.Version("latest"), ) - // Setup google maps - c, err := config.Get("google.apikey") + // decide whether to use google or osrm + c, err := config.Get("routing.mode") if err != nil { logger.Fatalf("Error loading config: %v", err) } - apiKey := c.String("") - if len(apiKey) == 0 { - logger.Fatalf("Missing required config: google.apikey") - } - m, err := maps.NewClient(maps.WithAPIKey(apiKey)) - if err != nil { - logger.Fatalf("Error configuring google maps client: %v", err) - } + // defaults to google + mode := c.String("google") - // Register handler - pb.RegisterRoutingHandler(srv.Server(), &handler.Routing{m}) + switch mode { + case "google": + // Setup google maps + c, err := config.Get("google.api.key") + if err != nil { + logger.Fatalf("Error loading config: %v", err) + } + apiKey := c.String("") + if len(apiKey) == 0 { + logger.Fatalf("Missing required config: google.apikey") + } + m, err := maps.NewClient(maps.WithAPIKey(apiKey)) + if err != nil { + logger.Fatalf("Error configuring google maps client: %v", err) + } + + // Register handler + pb.RegisterRoutingHandler(srv.Server(), &handler.Google{m}) + case "osrm": + // todo + // Setup google maps + c, err := config.Get("routing.address") + if err != nil { + logger.Fatalf("Error loading config: %v", err) + } + apiAddr := c.String("http://router.project-osrm.org") + if len(apiAddr) == 0 { + logger.Fatalf("Missing required config: osrm.api.address") + } + // Register handler + pb.RegisterRoutingHandler(srv.Server(), &handler.OSRM{Address: apiAddr}) + default: + logger.Fatalf("%s is an unsupported mode", mode) + } // Run service if err := srv.Run(); err != nil { diff --git a/routing/proto/routing.pb.go b/routing/proto/routing.pb.go index 20f31c1..aa6baa2 100644 --- a/routing/proto/routing.pb.go +++ b/routing/proto/routing.pb.go @@ -1,16 +1,14 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.15.5 +// protoc-gen-go v1.26.0 +// protoc v3.15.6 // source: proto/routing.proto package routing import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -22,17 +20,13 @@ const ( _ = 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 Point struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Latitude *wrapperspb.DoubleValue `protobuf:"bytes,1,opt,name=latitude,proto3" json:"latitude,omitempty"` - Longitude *wrapperspb.DoubleValue `protobuf:"bytes,2,opt,name=longitude,proto3" json:"longitude,omitempty"` + Latitude float64 `protobuf:"fixed64,1,opt,name=latitude,proto3" json:"latitude,omitempty"` + Longitude float64 `protobuf:"fixed64,2,opt,name=longitude,proto3" json:"longitude,omitempty"` } func (x *Point) Reset() { @@ -67,17 +61,80 @@ func (*Point) Descriptor() ([]byte, []int) { return file_proto_routing_proto_rawDescGZIP(), []int{0} } -func (x *Point) GetLatitude() *wrapperspb.DoubleValue { +func (x *Point) GetLatitude() float64 { if x != nil { return x.Latitude } - return nil + return 0 } -func (x *Point) GetLongitude() *wrapperspb.DoubleValue { +func (x *Point) GetLongitude() float64 { if x != nil { return x.Longitude } + return 0 +} + +type Waypoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Distance float64 `protobuf:"fixed64,2,opt,name=distance,proto3" json:"distance,omitempty"` + Location *Point `protobuf:"bytes,3,opt,name=location,proto3" json:"location,omitempty"` +} + +func (x *Waypoint) Reset() { + *x = Waypoint{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_routing_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Waypoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Waypoint) ProtoMessage() {} + +func (x *Waypoint) ProtoReflect() protoreflect.Message { + mi := &file_proto_routing_proto_msgTypes[1] + 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 Waypoint.ProtoReflect.Descriptor instead. +func (*Waypoint) Descriptor() ([]byte, []int) { + return file_proto_routing_proto_rawDescGZIP(), []int{1} +} + +func (x *Waypoint) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Waypoint) GetDistance() float64 { + if x != nil { + return x.Distance + } + return 0 +} + +func (x *Waypoint) GetLocation() *Point { + if x != nil { + return x.Location + } return nil } @@ -86,14 +143,18 @@ type RouteRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Origin *Point `protobuf:"bytes,1,opt,name=origin,proto3" json:"origin,omitempty"` + // Point of origin for the trip + Origin *Point `protobuf:"bytes,1,opt,name=origin,proto3" json:"origin,omitempty"` + // Point of destination for the trip Destination *Point `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"` + // Mode of transport e.g driving, walking, cycling + Transport string `protobuf:"bytes,3,opt,name=transport,proto3" json:"transport,omitempty"` } func (x *RouteRequest) Reset() { *x = RouteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_routing_proto_msgTypes[1] + mi := &file_proto_routing_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -106,7 +167,7 @@ func (x *RouteRequest) String() string { func (*RouteRequest) ProtoMessage() {} func (x *RouteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_routing_proto_msgTypes[1] + mi := &file_proto_routing_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -119,7 +180,7 @@ func (x *RouteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RouteRequest.ProtoReflect.Descriptor instead. func (*RouteRequest) Descriptor() ([]byte, []int) { - return file_proto_routing_proto_rawDescGZIP(), []int{1} + return file_proto_routing_proto_rawDescGZIP(), []int{2} } func (x *RouteRequest) GetOrigin() *Point { @@ -136,18 +197,25 @@ func (x *RouteRequest) GetDestination() *Point { return nil } +func (x *RouteRequest) GetTransport() string { + if x != nil { + return x.Transport + } + return "" +} + type RouteResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Waypoints []*Point `protobuf:"bytes,1,rep,name=waypoints,proto3" json:"waypoints,omitempty"` + Waypoints []*Waypoint `protobuf:"bytes,1,rep,name=waypoints,proto3" json:"waypoints,omitempty"` } func (x *RouteResponse) Reset() { *x = RouteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_routing_proto_msgTypes[2] + mi := &file_proto_routing_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -160,7 +228,7 @@ func (x *RouteResponse) String() string { func (*RouteResponse) ProtoMessage() {} func (x *RouteResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_routing_proto_msgTypes[2] + mi := &file_proto_routing_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -173,10 +241,10 @@ func (x *RouteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RouteResponse.ProtoReflect.Descriptor instead. func (*RouteResponse) Descriptor() ([]byte, []int) { - return file_proto_routing_proto_rawDescGZIP(), []int{2} + return file_proto_routing_proto_rawDescGZIP(), []int{3} } -func (x *RouteResponse) GetWaypoints() []*Point { +func (x *RouteResponse) GetWaypoints() []*Waypoint { if x != nil { return x.Waypoints } @@ -187,32 +255,35 @@ var File_proto_routing_proto protoreflect.FileDescriptor var file_proto_routing_proto_rawDesc = []byte{ 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x1a, 0x1e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7d, - 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, - 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, - 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x68, 0x0a, - 0x0c, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, - 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x0d, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x77, 0x61, 0x79, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x09, 0x77, 0x61, 0x79, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x32, 0x43, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x70, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x41, + 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x22, 0x66, 0x0a, 0x08, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x86, 0x01, 0x0a, 0x0c, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x06, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x22, 0x40, 0x0a, 0x0d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x77, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x09, 0x77, 0x61, 0x79, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x32, 0x43, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x38, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } @@ -229,26 +300,25 @@ func file_proto_routing_proto_rawDescGZIP() []byte { return file_proto_routing_proto_rawDescData } -var file_proto_routing_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_proto_routing_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_proto_routing_proto_goTypes = []interface{}{ - (*Point)(nil), // 0: routing.Point - (*RouteRequest)(nil), // 1: routing.RouteRequest - (*RouteResponse)(nil), // 2: routing.RouteResponse - (*wrapperspb.DoubleValue)(nil), // 3: google.protobuf.DoubleValue + (*Point)(nil), // 0: routing.Point + (*Waypoint)(nil), // 1: routing.Waypoint + (*RouteRequest)(nil), // 2: routing.RouteRequest + (*RouteResponse)(nil), // 3: routing.RouteResponse } var file_proto_routing_proto_depIdxs = []int32{ - 3, // 0: routing.Point.latitude:type_name -> google.protobuf.DoubleValue - 3, // 1: routing.Point.longitude:type_name -> google.protobuf.DoubleValue - 0, // 2: routing.RouteRequest.origin:type_name -> routing.Point - 0, // 3: routing.RouteRequest.destination:type_name -> routing.Point - 0, // 4: routing.RouteResponse.waypoints:type_name -> routing.Point - 1, // 5: routing.Routing.Route:input_type -> routing.RouteRequest - 2, // 6: routing.Routing.Route:output_type -> routing.RouteResponse - 6, // [6:7] is the sub-list for method output_type - 5, // [5:6] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 0, // 0: routing.Waypoint.location:type_name -> routing.Point + 0, // 1: routing.RouteRequest.origin:type_name -> routing.Point + 0, // 2: routing.RouteRequest.destination:type_name -> routing.Point + 1, // 3: routing.RouteResponse.waypoints:type_name -> routing.Waypoint + 2, // 4: routing.Routing.Route:input_type -> routing.RouteRequest + 3, // 5: routing.Routing.Route:output_type -> routing.RouteResponse + 5, // [5:6] is the sub-list for method output_type + 4, // [4:5] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_proto_routing_proto_init() } @@ -270,7 +340,7 @@ func file_proto_routing_proto_init() { } } file_proto_routing_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RouteRequest); i { + switch v := v.(*Waypoint); i { case 0: return &v.state case 1: @@ -282,6 +352,18 @@ func file_proto_routing_proto_init() { } } file_proto_routing_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RouteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_routing_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RouteResponse); i { case 0: return &v.state @@ -300,7 +382,7 @@ func file_proto_routing_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_routing_proto_rawDesc, NumEnums: 0, - NumMessages: 3, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, diff --git a/routing/proto/routing.pb.micro.go b/routing/proto/routing.pb.micro.go index f157232..cd942fa 100644 --- a/routing/proto/routing.pb.micro.go +++ b/routing/proto/routing.pb.micro.go @@ -6,7 +6,6 @@ package routing import ( fmt "fmt" proto "github.com/golang/protobuf/proto" - _ "google.golang.org/protobuf/types/known/wrapperspb" math "math" ) diff --git a/routing/proto/routing.proto b/routing/proto/routing.proto index ff22263..a67dfe7 100644 --- a/routing/proto/routing.proto +++ b/routing/proto/routing.proto @@ -3,22 +3,30 @@ syntax = "proto3"; package routing; option go_package = "./proto;routing"; -import "google/protobuf/wrappers.proto"; - service Routing { rpc Route(RouteRequest) returns (RouteResponse) {} } message Point { - google.protobuf.DoubleValue latitude = 1; - google.protobuf.DoubleValue longitude = 2; + double latitude = 1; + double longitude = 2; +} + +message Waypoint { + string name = 1; + double distance = 2; + Point location = 3; } message RouteRequest { + // Point of origin for the trip Point origin = 1; + // Point of destination for the trip Point destination = 2; + // Mode of transport e.g driving, walking, cycling + string transport = 3; } message RouteResponse { - repeated Point waypoints = 1; + repeated Waypoint waypoints = 1; }