diff --git a/error.go b/error.go index 1fe5893..ab8d02a 100644 --- a/error.go +++ b/error.go @@ -1,7 +1,7 @@ package grpc import ( - pberr "github.com/unistack-org/micro-server-grpc/errors" + pberr "github.com/unistack-org/micro-client-grpc/errors" "github.com/unistack-org/micro/v3/errors" "google.golang.org/grpc/status" ) diff --git a/errors/errors.go b/errors/errors.go new file mode 100644 index 0000000..6dde75c --- /dev/null +++ b/errors/errors.go @@ -0,0 +1,159 @@ +package errors + +import ( + "fmt" +) + +func (e *Error) Error() string { + return fmt.Sprintf(`{"id":"%s","code":%d,"detail":"%s","status":"%s"}`, e.Id, e.Code, e.Detail, e.Status) +} + +// New generates a custom error. +func New(id, detail string, code int32) error { + return &Error{ + Id: id, + Code: code, + Detail: detail, + // Status: http.StatusText(int(code)), + } +} + +// BadRequest generates a 400 error. +func BadRequest(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 400, + Detail: fmt.Sprintf(format, a...), + // Status: http.StatusText(400), + } +} + +// Unauthorized generates a 401 error. +func Unauthorized(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 401, + Detail: fmt.Sprintf(format, a...), + // Status: http.StatusText(401), + } +} + +// Forbidden generates a 403 error. +func Forbidden(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 403, + Detail: fmt.Sprintf(format, a...), + // Status: http.StatusText(403), + } +} + +// NotFound generates a 404 error. +func NotFound(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 404, + Detail: fmt.Sprintf(format, a...), + // Status: http.StatusText(404), + } +} + +// MethodNotAllowed generates a 405 error. +func MethodNotAllowed(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 405, + Detail: fmt.Sprintf(format, a...), + //Status: http.StatusText(405), + } +} + +// Timeout generates a 408 error. +func Timeout(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 408, + Detail: fmt.Sprintf(format, a...), + //Status: http.StatusText(408), + } +} + +// Conflict generates a 409 error. +func Conflict(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 409, + Detail: fmt.Sprintf(format, a...), + //Status: http.StatusText(409), + } +} + +// InternalServerError generates a 500 error. +func InternalServerError(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 500, + Detail: fmt.Sprintf(format, a...), + //Status: http.StatusText(500), + } +} + +// NotImplemented generates a 501 error +func NotImplemented(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 501, + Detail: fmt.Sprintf(format, a...), + //Status: http.StatusText(501), + } +} + +// BadGateway generates a 502 error +func BadGateway(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 502, + Detail: fmt.Sprintf(format, a...), + // Status: http.StatusText(502), + } +} + +// ServiceUnavailable generates a 503 error +func ServiceUnavailable(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 503, + Detail: fmt.Sprintf(format, a...), + //Status: http.StatusText(503), + } +} + +// GatewayTimeout generates a 504 error +func GatewayTimeout(id, format string, a ...interface{}) error { + return &Error{ + Id: id, + Code: 504, + Detail: fmt.Sprintf(format, a...), + //Status: http.StatusText(504), + } +} + +// Equal tries to compare errors +func Equal(err1 error, err2 error) bool { + verr1, ok1 := err1.(*Error) + verr2, ok2 := err2.(*Error) + + if ok1 != ok2 { + return false + } + + if !ok1 { + return err1 == err2 + } + + if verr1.Code != verr2.Code { + return false + } + + return true +} diff --git a/errors/errors.pb.go b/errors/errors.pb.go new file mode 100644 index 0000000..b66a42c --- /dev/null +++ b/errors/errors.pb.go @@ -0,0 +1,173 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0-devel +// protoc v3.6.1 +// source: errors.proto + +package errors + +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 Error struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` + Detail string `protobuf:"bytes,3,opt,name=detail,proto3" json:"detail,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *Error) Reset() { + *x = Error{} + if protoimpl.UnsafeEnabled { + mi := &file_errors_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Error) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Error) ProtoMessage() {} + +func (x *Error) ProtoReflect() protoreflect.Message { + mi := &file_errors_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 Error.ProtoReflect.Descriptor instead. +func (*Error) Descriptor() ([]byte, []int) { + return file_errors_proto_rawDescGZIP(), []int{0} +} + +func (x *Error) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Error) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *Error) GetDetail() string { + if x != nil { + return x.Detail + } + return "" +} + +func (x *Error) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +var File_errors_proto protoreflect.FileDescriptor + +var file_errors_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x5b, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_errors_proto_rawDescOnce sync.Once + file_errors_proto_rawDescData = file_errors_proto_rawDesc +) + +func file_errors_proto_rawDescGZIP() []byte { + file_errors_proto_rawDescOnce.Do(func() { + file_errors_proto_rawDescData = protoimpl.X.CompressGZIP(file_errors_proto_rawDescData) + }) + return file_errors_proto_rawDescData +} + +var file_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_errors_proto_goTypes = []interface{}{ + (*Error)(nil), // 0: errors.Error +} +var file_errors_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_errors_proto_init() } +func file_errors_proto_init() { + if File_errors_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_errors_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Error); 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_errors_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_errors_proto_goTypes, + DependencyIndexes: file_errors_proto_depIdxs, + MessageInfos: file_errors_proto_msgTypes, + }.Build() + File_errors_proto = out.File + file_errors_proto_rawDesc = nil + file_errors_proto_goTypes = nil + file_errors_proto_depIdxs = nil +} diff --git a/errors/errors.pb.micro.go b/errors/errors.pb.micro.go new file mode 100644 index 0000000..f1bb9d4 --- /dev/null +++ b/errors/errors.pb.micro.go @@ -0,0 +1,21 @@ +// Code generated by protoc-gen-micro. DO NOT EDIT. +// source: errors.proto + +package errors + +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 diff --git a/errors/errors.proto b/errors/errors.proto new file mode 100644 index 0000000..e9d51ff --- /dev/null +++ b/errors/errors.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package errors; + +message Error { + string id = 1; + int32 code = 2; + string detail = 3; + string status = 4; +}; diff --git a/generate.go b/generate.go new file mode 100644 index 0000000..599d850 --- /dev/null +++ b/generate.go @@ -0,0 +1,3 @@ +package grpc + +//go:generate protoc -I./errors -I. --go-grpc_out=paths=source_relative:./errors --go_out=paths=source_relative:./errors --micro_out=paths=source_relative:./errors errors/errors.proto diff --git a/go.mod b/go.mod index 572e231..aeb252c 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,12 @@ go 1.15 require ( github.com/golang/protobuf v1.4.2 + github.com/google/go-cmp v0.5.1 // indirect github.com/unistack-org/micro-codec-bytes v0.0.0-20200828083432-4e49e953d844 - github.com/unistack-org/micro-server-grpc v0.0.0-20200922093840-830e8ebadd70 github.com/unistack-org/micro/v3 v3.0.0-gamma.0.20200920124807-9b11ea527aeb + golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 // indirect + golang.org/x/text v0.3.3 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/grpc v1.31.1 google.golang.org/protobuf v1.25.0 ) diff --git a/go.sum b/go.sum index 092f601..1c3ca44 100644 --- a/go.sum +++ b/go.sum @@ -258,8 +258,6 @@ github.com/unistack-org/micro-codec-bytes v0.0.0-20200828083432-4e49e953d844 h1: github.com/unistack-org/micro-codec-bytes v0.0.0-20200828083432-4e49e953d844/go.mod h1:g5sOI8TWgGZiVHe8zoUPdtz7+0oLnqTnfBoai6Qb7jE= github.com/unistack-org/micro-config-cmd v0.0.0-20200909210346-ec89783dc46c/go.mod h1:6pm1cadbwsFcEW1ZbV5Fp0i3goR3TNfROMNSPih3I8k= github.com/unistack-org/micro-config-cmd v0.0.0-20200909210755-6e7e85eeab34/go.mod h1:fT1gYn+TtfVZZ5tNx56bZIncJjmlji66g7GKdWua5hE= -github.com/unistack-org/micro-server-grpc v0.0.0-20200922093840-830e8ebadd70 h1:j6+e/TM92t5lxr6uYc1/bjj80wWgUuZIwgNQ9uIUUDY= -github.com/unistack-org/micro-server-grpc v0.0.0-20200922093840-830e8ebadd70/go.mod h1:3q7iOC9p1EEyC12gsiUL7HiYD9I44IdnhdW6y8ZkrgQ= github.com/unistack-org/micro/v3 v3.0.0-20200827083227-aa99378adc6e h1:oMUWUSX7pQNdujHQRp4rlDg3+MCah05uYc2+ouz+V2Q= github.com/unistack-org/micro/v3 v3.0.0-20200827083227-aa99378adc6e/go.mod h1:rPQbnry3nboAnMczj8B1Gzlcyv/HYoMZLgd3/3nttJ4= github.com/unistack-org/micro/v3 v3.0.0-gamma.0.20200909210629-caec730248b1/go.mod h1:mmqHR9WelHUXqg2mELjsQ+FJHcWs6mNmXg+wEYO2T3c=