@@ -12,28 +12,24 @@ import org.http4s.{Charset, ContentCoding, DecodeResult, Entity, EntityDecoder,
12
12
import org .ivovk .connect_rpc_scala .ConnectRpcHttpRoutes .getClass
13
13
import org .slf4j .{Logger , LoggerFactory }
14
14
import scalapb .json4s .{JsonFormat , Printer }
15
- import scalapb .{GeneratedMessage , GeneratedMessageCompanion }
15
+ import scalapb .{GeneratedMessage as Message , GeneratedMessageCompanion as Companion }
16
16
17
- trait MessageCodec [F [_]] {
17
+ object MessageCodec {
18
+ given [F [_] : Applicative , A <: Message ](using codec : MessageCodec [F ], cmp : Companion [A ]): EntityDecoder [F , A ] =
19
+ EntityDecoder .decodeBy(MediaRange .`*/*`)(codec.decode)
18
20
19
- val mediaType : MediaType
21
+ given [F [_], A <: Message ](using codec : MessageCodec [F ]): EntityEncoder [F , A ] =
22
+ EntityEncoder .encodeBy(`Content-Type`(codec.mediaType))(codec.encode)
23
+ }
20
24
21
- def decode [ A <: GeneratedMessage ]( m : Media [ F ])( using cmp : GeneratedMessageCompanion [ A ]) : DecodeResult [ F , A ]
25
+ trait MessageCodec [ F [_]] {
22
26
23
- def encode [ A <: GeneratedMessage ]( message : A ) : Entity [ F ]
27
+ val mediaType : MediaType
24
28
25
- }
29
+ def decode [ A <: Message ]( m : Media [ F ])( using cmp : Companion [ A ]) : DecodeResult [ F , A ]
26
30
27
- object MessageCodec {
28
- given [F [_] : Applicative , A <: GeneratedMessage ](
29
- using codec : MessageCodec [F ], cmp : GeneratedMessageCompanion [A ]
30
- ): EntityDecoder [F , A ] =
31
- EntityDecoder .decodeBy(MediaRange .`*/*`)(codec.decode)
31
+ def encode [A <: Message ](message : A ): Entity [F ]
32
32
33
- given [F [_], A <: GeneratedMessage ](
34
- using codec : MessageCodec [F ]
35
- ): EntityEncoder [F , A ] =
36
- EntityEncoder .encodeBy(`Content-Type`(codec.mediaType))(codec.encode)
37
33
}
38
34
39
35
class JsonMessageCodec [F [_] : Sync : Compression ](jsonPrinter : Printer ) extends MessageCodec [F ] {
@@ -42,7 +38,7 @@ class JsonMessageCodec[F[_] : Sync : Compression](jsonPrinter: Printer) extends
42
38
43
39
override val mediaType : MediaType = MediaType .application.`json`
44
40
45
- override def decode [A <: GeneratedMessage ](m : Media [F ])(using cmp : GeneratedMessageCompanion [A ]): DecodeResult [F , A ] = {
41
+ override def decode [A <: Message ](m : Media [F ])(using cmp : Companion [A ]): DecodeResult [F , A ] = {
46
42
val charset = m.charset.getOrElse(Charset .`UTF-8`).nioCharset
47
43
48
44
val f = decompressed(m)
@@ -60,7 +56,7 @@ class JsonMessageCodec[F[_] : Sync : Compression](jsonPrinter: Printer) extends
60
56
EitherT .right(f)
61
57
}
62
58
63
- override def encode [A <: GeneratedMessage ](message : A ): Entity [F ] = {
59
+ override def encode [A <: Message ](message : A ): Entity [F ] = {
64
60
val string = jsonPrinter.print(message)
65
61
66
62
if (logger.isTraceEnabled) {
@@ -79,7 +75,7 @@ class ProtoMessageCodec[F[_] : Async : Compression] extends MessageCodec[F] {
79
75
override val mediaType : MediaType =
80
76
MediaType .unsafeParse(" application/proto" )
81
77
82
- override def decode [A <: GeneratedMessage ](m : Media [F ])(using cmp : GeneratedMessageCompanion [A ]): DecodeResult [F , A ] = {
78
+ override def decode [A <: Message ](m : Media [F ])(using cmp : Companion [A ]): DecodeResult [F , A ] = {
83
79
val f = toInputStreamResource(decompressed(m)).use { is =>
84
80
Async [F ].delay {
85
81
val message = cmp.parseFrom(is)
@@ -96,7 +92,7 @@ class ProtoMessageCodec[F[_] : Async : Compression] extends MessageCodec[F] {
96
92
EitherT .right(f)
97
93
}
98
94
99
- override def encode [A <: GeneratedMessage ](message : A ): Entity [F ] = {
95
+ override def encode [A <: Message ](message : A ): Entity [F ] = {
100
96
if (logger.isTraceEnabled) {
101
97
logger.trace(s " <<< Proto: ${message.toProtoString}" )
102
98
}
0 commit comments