Skip to content

Commit bec1dca

Browse files
authored
Filter out optionals by default (#87)
1 parent c070f65 commit bec1dca

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

modules/core/src/main/scala/jsonrpclib/internals/RawMessage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ private[jsonrpclib] object RawMessage {
6363
"params" -> msg.params.asJson,
6464
"error" -> msg.error.asJson,
6565
"id" -> msg.id.asJson
66-
) ++ {
66+
).filterNot(_._2.isNull) ++ {
6767
msg.result match {
6868
case Some(Some(payload)) => List("result" -> payload.asJson)
6969
case Some(None) => List("result" -> Json.Null)

modules/core/src/test/scala/jsonrpclib/RawMessageSpec.scala

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import jsonrpclib.CallId.NumberId
77
import jsonrpclib.OutputMessage.ResponseMessage
88
import io.circe.Json
99
import com.github.plokhotnyuk.jsoniter_scala.circe.JsoniterScalaCodec._
10+
import io.circe.syntax._
1011

1112
object RawMessageSpec extends FunSuite {
1213
test("json parsing with null result") {
1314
// This is a perfectly valid response object, as result field has to be present,
1415
// but can be null: https://www.jsonrpc.org/specification#response_object
15-
val rawMessage = readFromString[Json](""" {"jsonrpc":"2.0","result":null,"id":3} """.trim)
16+
val rawMessage = readFromString[Json](""" {"jsonrpc":"2.0","id":3,"result":null}""".trim)
1617
.as[RawMessage]
1718
.fold(throw _, identity)
1819

@@ -31,4 +32,40 @@ object RawMessageSpec extends FunSuite {
3132
) &&
3233
assert(invalidRawMessage.toMessage.isLeft, invalidRawMessage.toMessage.toString)
3334
}
35+
36+
test("request message serialization") {
37+
val input: Message = InputMessage.RequestMessage("my/method", CallId.NumberId(1), None)
38+
val expected = """{"jsonrpc":"2.0","method":"my/method","id":1}"""
39+
val result = writeToString(input.asJson)
40+
41+
assert(result == expected, s"Expected: $expected, got: $result")
42+
}
43+
44+
test("notification message serialization") {
45+
val input: Message = InputMessage.NotificationMessage("my/method", None)
46+
val expected = """{"jsonrpc":"2.0","method":"my/method"}"""
47+
val result = writeToString(input.asJson)
48+
49+
assert(result == expected, s"Expected: $expected, got: $result")
50+
}
51+
52+
test("response message serialization") {
53+
val input: Message = OutputMessage.ResponseMessage(CallId.NumberId(1), Payload.NullPayload)
54+
val expected = """{"jsonrpc":"2.0","id":1,"result":null}"""
55+
val result = writeToString(input.asJson)
56+
57+
assert(result == expected, s"Expected: $expected, got: $result")
58+
}
59+
60+
test("error message serialization") {
61+
val input: Message = OutputMessage.ErrorMessage(
62+
CallId.NumberId(1),
63+
ErrorPayload(-32603, "Internal error", None)
64+
)
65+
val expected = """{"jsonrpc":"2.0","error":{"code":-32603,"message":"Internal error","data":null},"id":1}"""
66+
val result = writeToString(input.asJson)
67+
68+
assert(result == expected, s"Expected: $expected, got: $result")
69+
}
70+
3471
}

0 commit comments

Comments
 (0)