1
1
package org .ivovk .connect_rpc_scala
2
2
3
+ import com .google .protobuf .struct .{ListValue , NullValue , Struct , Value }
3
4
import io .grpc .{Metadata , Status }
4
5
import org .http4s .{Header , Headers }
5
6
import org .typelevel .ci .CIString
6
7
import scalapb .GeneratedMessage
8
+ import scalapb .descriptors .*
7
9
8
- object Mappings extends HeaderMappings , StatusCodeMappings , AnyMappings
10
+ object Mappings extends HeaderMappings , StatusCodeMappings , ProtoMappings
9
11
10
12
trait HeaderMappings {
11
13
@@ -103,14 +105,35 @@ trait StatusCodeMappings {
103
105
104
106
}
105
107
106
- trait AnyMappings {
108
+ trait ProtoMappings {
107
109
108
110
extension [T <: GeneratedMessage ](t : T ) {
109
111
def toProtoAny : com.google.protobuf.any.Any =
110
112
com.google.protobuf.any.Any (
111
113
typeUrl = " type.googleapis.com/" + t.companion.scalaDescriptor.fullName,
112
114
value = t.toByteString
113
115
)
116
+
117
+ def toProtoStruct : Struct = toValue(t.toPMessage).kind match {
118
+ case Value .Kind .StructValue (struct) => struct
119
+ case _ => throw new IllegalArgumentException (" Expected a struct value" )
120
+ }
121
+ }
122
+
123
+ def toValue (value : PValue ): Value = {
124
+ value match {
125
+ case PEmpty => Value .of(Value .Kind .NullValue (NullValue .NULL_VALUE ))
126
+ case PInt (value) => Value .of(Value .Kind .NumberValue (value.toDouble))
127
+ case PLong (value) => Value .of(Value .Kind .NumberValue (value.toDouble))
128
+ case PString (value) => Value .of(Value .Kind .StringValue (value))
129
+ case PDouble (value) => Value .of(Value .Kind .NumberValue (value))
130
+ case PFloat (value) => Value .of(Value .Kind .NumberValue (value.toDouble))
131
+ case PByteString (value) => Value .of(Value .Kind .StringValue (value.toStringUtf8))
132
+ case PBoolean (value) => Value .of(Value .Kind .BoolValue (value))
133
+ case PEnum (value) => Value .of(Value .Kind .StringValue (value.index.toString))
134
+ case PMessage (value) => Value .of(Value .Kind .StructValue (Struct (value.map((k, v) => k.name -> toValue(v)))))
135
+ case PRepeated (value) => Value .of(Value .Kind .ListValue (ListValue (value.map(toValue))))
136
+ }
114
137
}
115
138
116
139
}
0 commit comments