Coverage Summary for Class: ProtoStructSerializer (com.ghost.protobuf.wkt)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| ProtoStructSerializer |
100%
(1/1)
|
80%
(4/5)
|
100%
(12/12)
|
97%
(32/33)
|
99.3%
(138/139)
|
@file:OptIn(InternalGhostApi::class)
package com.ghost.protobuf.wkt
import com.ghost.serialization.InternalGhostApi
import com.ghost.serialization.contract.GhostSerializer
import com.ghost.serialization.parser.GhostJsonFlatReader
import com.ghost.serialization.parser.GhostJsonReader
import com.ghost.serialization.parser.beginObject
import com.ghost.serialization.parser.consumeArraySeparator
import com.ghost.serialization.parser.consumeKeySeparator
import com.ghost.serialization.parser.endObject
import com.ghost.serialization.parser.nextString
import com.ghost.serialization.writer.GhostJsonFlatWriter
import com.ghost.serialization.writer.GhostJsonWriter
import com.ghost.serialization.parser.GhostJsonConstants as C
/**
* Type alias for `Struct` message.
*
* `Struct` represents a structured data value, consisting of fields
* which map to dynamically typed values.
*/
typealias ProtoStruct = Map<String, ProtoValue>
/**
* Serializer for [ProtoStruct].
*/
object ProtoStructSerializer : GhostSerializer<ProtoStruct> {
override val typeName: String get() = C.WKT_STRUCT_TYPE
override fun serialize(writer: GhostJsonWriter, value: ProtoStruct) {
writer.beginObject()
for ((mapKey, mapValue) in value) {
writer.name(mapKey)
ProtoValueSerializer.serialize(writer, mapValue)
}
writer.endObject()
}
override fun serialize(writer: GhostJsonFlatWriter, value: ProtoStruct) {
writer.beginObject()
for ((mapKey, mapValue) in value) {
writer.name(mapKey)
ProtoValueSerializer.serialize(writer, mapValue)
}
writer.endObject()
}
override fun deserialize(reader: GhostJsonReader): ProtoStruct {
val map = mutableMapOf<String, ProtoValue>()
reader.beginObject()
while (reader.peekNextToken() != C.CLOSE_OBJ_INT) {
val key = reader.nextString()
reader.consumeKeySeparator()
val value = ProtoValueSerializer.deserialize(reader)
map[key] = value
if (reader.peekNextToken() == C.COMMA_INT) {
reader.consumeArraySeparator()
}
}
reader.endObject()
return map
}
override fun deserialize(reader: GhostJsonFlatReader): ProtoStruct {
val map = mutableMapOf<String, ProtoValue>()
reader.beginObject()
while (reader.peekNextToken() != C.CLOSE_OBJ_INT) {
val key = reader.nextString()
reader.consumeKeySeparator()
val value = ProtoValueSerializer.deserialize(reader)
map[key] = value
if (reader.peekNextToken() == C.COMMA_INT) {
reader.consumeArraySeparator()
}
}
reader.endObject()
return map
}
}