@@ -52,53 +52,74 @@ trait HeaderMappings {
52
52
53
53
trait StatusCodeMappings {
54
54
55
+ private val httpStatusCodesByGrpcStatusCode : Array [org.http4s.Status ] = {
56
+ val maxCode = io.grpc.Status .Code .values().map(_.value()).max
57
+ val codes = new Array [org.http4s.Status ](maxCode + 1 )
58
+
59
+ io.grpc.Status .Code .values().foreach { code =>
60
+ codes(code.value()) = code match {
61
+ case io.grpc.Status .Code .CANCELLED =>
62
+ org.http4s.Status .fromInt(499 ).getOrElse(sys.error(" Should not happen" ))
63
+ case io.grpc.Status .Code .UNKNOWN => org.http4s.Status .InternalServerError
64
+ case io.grpc.Status .Code .INVALID_ARGUMENT => org.http4s.Status .BadRequest
65
+ case io.grpc.Status .Code .DEADLINE_EXCEEDED => org.http4s.Status .GatewayTimeout
66
+ case io.grpc.Status .Code .NOT_FOUND => org.http4s.Status .NotFound
67
+ case io.grpc.Status .Code .ALREADY_EXISTS => org.http4s.Status .Conflict
68
+ case io.grpc.Status .Code .PERMISSION_DENIED => org.http4s.Status .Forbidden
69
+ case io.grpc.Status .Code .RESOURCE_EXHAUSTED => org.http4s.Status .TooManyRequests
70
+ case io.grpc.Status .Code .FAILED_PRECONDITION => org.http4s.Status .BadRequest
71
+ case io.grpc.Status .Code .ABORTED => org.http4s.Status .Conflict
72
+ case io.grpc.Status .Code .OUT_OF_RANGE => org.http4s.Status .BadRequest
73
+ case io.grpc.Status .Code .UNIMPLEMENTED => org.http4s.Status .NotImplemented
74
+ case io.grpc.Status .Code .INTERNAL => org.http4s.Status .InternalServerError
75
+ case io.grpc.Status .Code .UNAVAILABLE => org.http4s.Status .ServiceUnavailable
76
+ case io.grpc.Status .Code .DATA_LOSS => org.http4s.Status .InternalServerError
77
+ case io.grpc.Status .Code .UNAUTHENTICATED => org.http4s.Status .Unauthorized
78
+ case _ => org.http4s.Status .InternalServerError
79
+ }
80
+ }
81
+
82
+ codes
83
+ }
84
+
85
+ private val connectErrorCodeByGrpcStatusCode : Array [connectrpc.Code ] = {
86
+ val maxCode = io.grpc.Status .Code .values().map(_.value()).max
87
+ val codes = new Array [connectrpc.Code ](maxCode + 1 )
88
+
89
+ io.grpc.Status .Code .values().foreach { code =>
90
+ codes(code.value()) = code match {
91
+ case io.grpc.Status .Code .CANCELLED => connectrpc.Code .Canceled
92
+ case io.grpc.Status .Code .UNKNOWN => connectrpc.Code .Unknown
93
+ case io.grpc.Status .Code .INVALID_ARGUMENT => connectrpc.Code .InvalidArgument
94
+ case io.grpc.Status .Code .DEADLINE_EXCEEDED => connectrpc.Code .DeadlineExceeded
95
+ case io.grpc.Status .Code .NOT_FOUND => connectrpc.Code .NotFound
96
+ case io.grpc.Status .Code .ALREADY_EXISTS => connectrpc.Code .AlreadyExists
97
+ case io.grpc.Status .Code .PERMISSION_DENIED => connectrpc.Code .PermissionDenied
98
+ case io.grpc.Status .Code .RESOURCE_EXHAUSTED => connectrpc.Code .ResourceExhausted
99
+ case io.grpc.Status .Code .FAILED_PRECONDITION => connectrpc.Code .FailedPrecondition
100
+ case io.grpc.Status .Code .ABORTED => connectrpc.Code .Aborted
101
+ case io.grpc.Status .Code .OUT_OF_RANGE => connectrpc.Code .OutOfRange
102
+ case io.grpc.Status .Code .UNIMPLEMENTED => connectrpc.Code .Unimplemented
103
+ case io.grpc.Status .Code .INTERNAL => connectrpc.Code .Internal
104
+ case io.grpc.Status .Code .UNAVAILABLE => connectrpc.Code .Unavailable
105
+ case io.grpc.Status .Code .DATA_LOSS => connectrpc.Code .DataLoss
106
+ case io.grpc.Status .Code .UNAUTHENTICATED => connectrpc.Code .Unauthenticated
107
+ case _ => connectrpc.Code .Internal
108
+ }
109
+ }
110
+
111
+ codes
112
+ }
113
+
55
114
extension (status : io.grpc.Status ) {
56
115
def toHttpStatus : org.http4s.Status = status.getCode.toHttpStatus
57
- def toConnectCode : String = status.getCode.toConnectCode
116
+ def toConnectCode : connectrpc. Code = status.getCode.toConnectCode
58
117
}
59
118
60
119
// Url: https://connectrpc.com/docs/protocol/#error-codes
61
120
extension (code : io.grpc.Status .Code ) {
62
- def toHttpStatus : org.http4s.Status = code match {
63
- case io.grpc.Status .Code .CANCELLED =>
64
- org.http4s.Status .fromInt(499 ).getOrElse(org.http4s.Status .InternalServerError )
65
- case io.grpc.Status .Code .UNKNOWN => org.http4s.Status .InternalServerError
66
- case io.grpc.Status .Code .INVALID_ARGUMENT => org.http4s.Status .BadRequest
67
- case io.grpc.Status .Code .DEADLINE_EXCEEDED => org.http4s.Status .GatewayTimeout
68
- case io.grpc.Status .Code .NOT_FOUND => org.http4s.Status .NotFound
69
- case io.grpc.Status .Code .ALREADY_EXISTS => org.http4s.Status .Conflict
70
- case io.grpc.Status .Code .PERMISSION_DENIED => org.http4s.Status .Forbidden
71
- case io.grpc.Status .Code .RESOURCE_EXHAUSTED => org.http4s.Status .TooManyRequests
72
- case io.grpc.Status .Code .FAILED_PRECONDITION => org.http4s.Status .BadRequest
73
- case io.grpc.Status .Code .ABORTED => org.http4s.Status .Conflict
74
- case io.grpc.Status .Code .OUT_OF_RANGE => org.http4s.Status .BadRequest
75
- case io.grpc.Status .Code .UNIMPLEMENTED => org.http4s.Status .NotImplemented
76
- case io.grpc.Status .Code .INTERNAL => org.http4s.Status .InternalServerError
77
- case io.grpc.Status .Code .UNAVAILABLE => org.http4s.Status .ServiceUnavailable
78
- case io.grpc.Status .Code .DATA_LOSS => org.http4s.Status .InternalServerError
79
- case io.grpc.Status .Code .UNAUTHENTICATED => org.http4s.Status .Unauthorized
80
- case _ => org.http4s.Status .InternalServerError
81
- }
82
-
83
- def toConnectCode : String = code match {
84
- case io.grpc.Status .Code .CANCELLED => " canceled"
85
- case io.grpc.Status .Code .UNKNOWN => " unknown"
86
- case io.grpc.Status .Code .INVALID_ARGUMENT => " invalid_argument"
87
- case io.grpc.Status .Code .DEADLINE_EXCEEDED => " deadline_exceeded"
88
- case io.grpc.Status .Code .NOT_FOUND => " not_found"
89
- case io.grpc.Status .Code .ALREADY_EXISTS => " already_exists"
90
- case io.grpc.Status .Code .PERMISSION_DENIED => " permission_denied"
91
- case io.grpc.Status .Code .RESOURCE_EXHAUSTED => " resource_exhausted"
92
- case io.grpc.Status .Code .FAILED_PRECONDITION => " failed_precondition"
93
- case io.grpc.Status .Code .ABORTED => " aborted"
94
- case io.grpc.Status .Code .OUT_OF_RANGE => " out_of_range"
95
- case io.grpc.Status .Code .UNIMPLEMENTED => " unimplemented"
96
- case io.grpc.Status .Code .INTERNAL => " internal"
97
- case io.grpc.Status .Code .UNAVAILABLE => " unavailable"
98
- case io.grpc.Status .Code .DATA_LOSS => " data_loss"
99
- case io.grpc.Status .Code .UNAUTHENTICATED => " unauthenticated"
100
- case _ => " internal"
101
- }
121
+ def toHttpStatus : org.http4s.Status = httpStatusCodesByGrpcStatusCode(code.value())
122
+ def toConnectCode : connectrpc.Code = connectErrorCodeByGrpcStatusCode(code.value())
102
123
}
103
124
104
125
}
0 commit comments