From 4390fdad76d8f7810c7da1ecabc376995056e595 Mon Sep 17 00:00:00 2001 From: Asim Aslam Date: Mon, 26 Apr 2021 16:03:21 +0100 Subject: [PATCH] add eta method to routing service --- routing/handler/google.go | 6 + routing/handler/osrm.go | 57 +++++- routing/proto/routing.pb.go | 280 +++++++++++++++++++++++------- routing/proto/routing.pb.micro.go | 21 +++ routing/proto/routing.proto | 27 ++- 5 files changed, 318 insertions(+), 73 deletions(-) diff --git a/routing/handler/google.go b/routing/handler/google.go index ac856ae..a40802c 100644 --- a/routing/handler/google.go +++ b/routing/handler/google.go @@ -18,12 +18,18 @@ var ( ErrMissingLatitude = errors.BadRequest("MISSING_LATITUDE", "Missing latitude") ErrMissingLongitude = errors.BadRequest("MISSING_LONGITUDE", "Missing longitude") ErrNoRoutes = errors.BadRequest("NO_ROUTES", "No routes found") + ErrUnimplemented = errors.InternalServerError("UNIMPLEMENTED", "endpoint is unimplemented") ) type Google struct { Maps *maps.Client } +func (r *Google) ETA(ctx context.Context, req *pb.ETARequest, rsp *pb.ETAResponse) error { + // TODO: implement eta + return ErrUnimplemented +} + func (r *Google) Route(ctx context.Context, req *pb.RouteRequest, rsp *pb.RouteResponse) error { // validate the request if req.Origin == nil { diff --git a/routing/handler/osrm.go b/routing/handler/osrm.go index 9aeb8b8..4629e87 100644 --- a/routing/handler/osrm.go +++ b/routing/handler/osrm.go @@ -18,6 +18,60 @@ type OSRM struct { Client *osrm.OSRM } +func (o *OSRM) ETA(ctx context.Context, req *pb.ETARequest, rsp *pb.ETAResponse) 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 + } + + 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.StepsFalse, + Annotations: osrm.AnnotationsFalse, + Overview: osrm.OverviewFalse, + }) + if err != nil { + return errors.InternalServerError("routing.eta", "failed to get route: %v", err.Error()) + } + + if len(resp.Routes) == 0 { + return nil + } + + // distance is meters + distance := resp.Routes[0].Distance + // duration is seconds + duration := resp.Routes[0].Duration + + // nothing to calculate + if distance == 0.0 { + return nil + } + + // set the duration + rsp.Duration = float64(duration) + + // TODO: calculate transport/speed + + return nil +} + func (o *OSRM) Route(ctx context.Context, req *pb.RouteRequest, rsp *pb.RouteResponse) error { // validate the request if req.Origin == nil { @@ -54,9 +108,8 @@ func (o *OSRM) Route(ctx context.Context, req *pb.RouteRequest, rsp *pb.RouteRes {dest.Longitude, dest.Latitude}, }), Steps: osrm.StepsTrue, - Annotations: osrm.AnnotationsTrue, + Annotations: osrm.AnnotationsFalse, Overview: osrm.OverviewFalse, - Geometries: osrm.GeometriesPolyline6, }) if err != nil { return errors.InternalServerError("routing.route", "failed to get route: %v", err.Error()) diff --git a/routing/proto/routing.pb.go b/routing/proto/routing.pb.go index aa6baa2..31ecde0 100644 --- a/routing/proto/routing.pb.go +++ b/routing/proto/routing.pb.go @@ -80,9 +80,10 @@ type Waypoint struct { 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"` + // street name or related reference + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // gps point coordinates + Location *Point `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` } func (x *Waypoint) Reset() { @@ -124,13 +125,6 @@ func (x *Waypoint) GetName() string { 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 @@ -138,6 +132,127 @@ func (x *Waypoint) GetLocation() *Point { return nil } +type ETARequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Origin *Point `protobuf:"bytes,1,opt,name=origin,proto3" json:"origin,omitempty"` + Destination *Point `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"` + // type of transport e.g car, foot, bicycle + Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + // speed in kilometers + Speed float64 `protobuf:"fixed64,4,opt,name=speed,proto3" json:"speed,omitempty"` +} + +func (x *ETARequest) Reset() { + *x = ETARequest{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_routing_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ETARequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ETARequest) ProtoMessage() {} + +func (x *ETARequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_routing_proto_msgTypes[2] + 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 ETARequest.ProtoReflect.Descriptor instead. +func (*ETARequest) Descriptor() ([]byte, []int) { + return file_proto_routing_proto_rawDescGZIP(), []int{2} +} + +func (x *ETARequest) GetOrigin() *Point { + if x != nil { + return x.Origin + } + return nil +} + +func (x *ETARequest) GetDestination() *Point { + if x != nil { + return x.Destination + } + return nil +} + +func (x *ETARequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ETARequest) GetSpeed() float64 { + if x != nil { + return x.Speed + } + return 0 +} + +type ETAResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // eta in seconds + Duration float64 `protobuf:"fixed64,1,opt,name=duration,proto3" json:"duration,omitempty"` +} + +func (x *ETAResponse) Reset() { + *x = ETAResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_routing_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ETAResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ETAResponse) ProtoMessage() {} + +func (x *ETAResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_routing_proto_msgTypes[3] + 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 ETAResponse.ProtoReflect.Descriptor instead. +func (*ETAResponse) Descriptor() ([]byte, []int) { + return file_proto_routing_proto_rawDescGZIP(), []int{3} +} + +func (x *ETAResponse) GetDuration() float64 { + if x != nil { + return x.Duration + } + return 0 +} + type RouteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -147,14 +262,12 @@ type RouteRequest struct { 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[2] + mi := &file_proto_routing_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -167,7 +280,7 @@ func (x *RouteRequest) String() string { func (*RouteRequest) ProtoMessage() {} func (x *RouteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_routing_proto_msgTypes[2] + mi := &file_proto_routing_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -180,7 +293,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{2} + return file_proto_routing_proto_rawDescGZIP(), []int{4} } func (x *RouteRequest) GetOrigin() *Point { @@ -197,25 +310,19 @@ 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 []*Waypoint `protobuf:"bytes,1,rep,name=waypoints,proto3" json:"waypoints,omitempty"` + // waypoints on the route + Waypoints []*Waypoint `protobuf:"bytes,2,rep,name=waypoints,proto3" json:"waypoints,omitempty"` } func (x *RouteResponse) Reset() { *x = RouteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_routing_proto_msgTypes[3] + mi := &file_proto_routing_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -228,7 +335,7 @@ func (x *RouteResponse) String() string { func (*RouteResponse) ProtoMessage() {} func (x *RouteResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_routing_proto_msgTypes[3] + mi := &file_proto_routing_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -241,7 +348,7 @@ func (x *RouteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RouteResponse.ProtoReflect.Descriptor instead. func (*RouteResponse) Descriptor() ([]byte, []int) { - return file_proto_routing_proto_rawDescGZIP(), []int{3} + return file_proto_routing_proto_rawDescGZIP(), []int{5} } func (x *RouteResponse) GetWaypoints() []*Waypoint { @@ -260,32 +367,43 @@ var file_proto_routing_proto_rawDesc = []byte{ 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, + 0x65, 0x22, 0x4a, 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, + 0x65, 0x12, 0x2a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 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, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x90, 0x01, + 0x0a, 0x0a, 0x45, 0x54, 0x41, 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, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, + 0x22, 0x29, 0x0a, 0x0b, 0x45, 0x54, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 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, 0x02, 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, 0x77, 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, 0x12, 0x32, 0x0a, 0x03, + 0x45, 0x54, 0x41, 0x12, 0x13, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x54, + 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x2e, 0x45, 0x54, 0x41, 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, } var ( @@ -300,25 +418,31 @@ func file_proto_routing_proto_rawDescGZIP() []byte { return file_proto_routing_proto_rawDescData } -var file_proto_routing_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_proto_routing_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_proto_routing_proto_goTypes = []interface{}{ (*Point)(nil), // 0: routing.Point (*Waypoint)(nil), // 1: routing.Waypoint - (*RouteRequest)(nil), // 2: routing.RouteRequest - (*RouteResponse)(nil), // 3: routing.RouteResponse + (*ETARequest)(nil), // 2: routing.ETARequest + (*ETAResponse)(nil), // 3: routing.ETAResponse + (*RouteRequest)(nil), // 4: routing.RouteRequest + (*RouteResponse)(nil), // 5: routing.RouteResponse } var file_proto_routing_proto_depIdxs = []int32{ 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 + 0, // 1: routing.ETARequest.origin:type_name -> routing.Point + 0, // 2: routing.ETARequest.destination:type_name -> routing.Point + 0, // 3: routing.RouteRequest.origin:type_name -> routing.Point + 0, // 4: routing.RouteRequest.destination:type_name -> routing.Point + 1, // 5: routing.RouteResponse.waypoints:type_name -> routing.Waypoint + 4, // 6: routing.Routing.Route:input_type -> routing.RouteRequest + 2, // 7: routing.Routing.ETA:input_type -> routing.ETARequest + 5, // 8: routing.Routing.Route:output_type -> routing.RouteResponse + 3, // 9: routing.Routing.ETA:output_type -> routing.ETAResponse + 8, // [8:10] is the sub-list for method output_type + 6, // [6:8] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_proto_routing_proto_init() } @@ -352,7 +476,7 @@ func file_proto_routing_proto_init() { } } file_proto_routing_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RouteRequest); i { + switch v := v.(*ETARequest); i { case 0: return &v.state case 1: @@ -364,6 +488,30 @@ func file_proto_routing_proto_init() { } } file_proto_routing_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ETAResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_routing_proto_msgTypes[4].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[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RouteResponse); i { case 0: return &v.state @@ -382,7 +530,7 @@ func file_proto_routing_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_routing_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/routing/proto/routing.pb.micro.go b/routing/proto/routing.pb.micro.go index cd942fa..3953055 100644 --- a/routing/proto/routing.pb.micro.go +++ b/routing/proto/routing.pb.micro.go @@ -42,7 +42,10 @@ func NewRoutingEndpoints() []*api.Endpoint { // Client API for Routing service type RoutingService interface { + // Route returns a gps route from origin to destination based on lat/lng Route(ctx context.Context, in *RouteRequest, opts ...client.CallOption) (*RouteResponse, error) + // ETA returns an estimated time of arrival for a route + ETA(ctx context.Context, in *ETARequest, opts ...client.CallOption) (*ETAResponse, error) } type routingService struct { @@ -67,15 +70,29 @@ func (c *routingService) Route(ctx context.Context, in *RouteRequest, opts ...cl return out, nil } +func (c *routingService) ETA(ctx context.Context, in *ETARequest, opts ...client.CallOption) (*ETAResponse, error) { + req := c.c.NewRequest(c.name, "Routing.ETA", in) + out := new(ETAResponse) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // Server API for Routing service type RoutingHandler interface { + // Route returns a gps route from origin to destination based on lat/lng Route(context.Context, *RouteRequest, *RouteResponse) error + // ETA returns an estimated time of arrival for a route + ETA(context.Context, *ETARequest, *ETAResponse) error } func RegisterRoutingHandler(s server.Server, hdlr RoutingHandler, opts ...server.HandlerOption) error { type routing interface { Route(ctx context.Context, in *RouteRequest, out *RouteResponse) error + ETA(ctx context.Context, in *ETARequest, out *ETAResponse) error } type Routing struct { routing @@ -91,3 +108,7 @@ type routingHandler struct { func (h *routingHandler) Route(ctx context.Context, in *RouteRequest, out *RouteResponse) error { return h.RoutingHandler.Route(ctx, in, out) } + +func (h *routingHandler) ETA(ctx context.Context, in *ETARequest, out *ETAResponse) error { + return h.RoutingHandler.ETA(ctx, in, out) +} diff --git a/routing/proto/routing.proto b/routing/proto/routing.proto index a67dfe7..e1a4342 100644 --- a/routing/proto/routing.proto +++ b/routing/proto/routing.proto @@ -4,7 +4,10 @@ package routing; option go_package = "./proto;routing"; service Routing { + // Route returns a gps route from origin to destination based on lat/lng rpc Route(RouteRequest) returns (RouteResponse) {} + // ETA returns an estimated time of arrival for a route + rpc ETA(ETARequest) returns (ETAResponse) {} } message Point { @@ -13,9 +16,24 @@ message Point { } message Waypoint { + // street name or related reference string name = 1; - double distance = 2; - Point location = 3; + // gps point coordinates + Point location = 2; +} + +message ETARequest { + Point origin = 1; + Point destination = 2; + // type of transport e.g car, foot, bicycle + string type = 3; + // speed in kilometers + double speed = 4; +} + +message ETAResponse { + // eta in seconds + double duration = 1; } message RouteRequest { @@ -23,10 +41,9 @@ message RouteRequest { 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 Waypoint waypoints = 1; + // waypoints on the route + repeated Waypoint waypoints = 2; }