blob: a4402124bc9dfd317ed2ed52f1b639ea23139c0f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
import endians
import json
import streams
import strformat
import nimpb/nimpb
import conformance_pb
import test_messages_proto3_pb
let
inputStream = newFileStream(stdin)
outputStream = newFileStream(stdout)
proc readInt32Le(s: Stream): int32 =
var value = readInt32(s)
littleEndian32(addr(result), addr(value))
proc writeInt32Le(s: Stream, value: int32) =
var value = value
var buf: int32
littleEndian32(addr(buf), addr(value))
write(s, buf)
proc myReadString(s: Stream, size: int): string =
result = newString(size)
if readData(s, addr(result[0]), size) != size:
raise newException(Exception, "failed to read data")
while true:
var requestSize = 0'i32
try:
requestSize = readInt32Le(inputStream)
except:
break
var requestData = myReadString(inputStream, requestSize)
let request = newConformance_ConformanceRequest(requestData)
let response = newConformance_ConformanceResponse()
if request.messageType == "protobuf_test_messages.proto2.TestAllTypesProto2":
response.skipped = "skipping proto2 tests"
else:
try:
var parsed: protobuf_test_messages_proto3_TestAllTypesProto3
if hasProtobufPayload(request):
parsed = newprotobuf_test_messages_proto3_TestAllTypesProto3(string(request.protobufPayload))
elif hasJsonPayload(request):
let node = parseJson(request.jsonPayload)
parsed = parseprotobuf_test_messages_proto3_TestAllTypesProto3FromJson(node)
if request.requestedOutputFormat == conformance_WireFormat.PROTOBUF:
let ser = serialize(parsed)
response.protobufPayload = bytes(ser)
elif request.requestedOutputFormat == conformance_WireFormat.JSON:
response.jsonPayload = $toJson(parsed)
except IOError as exc:
response.parse_error = exc.msg
except ParseError as exc:
response.parse_error = exc.msg
except ValueError as exc:
response.serializeError = exc.msg
except Exception as exc:
response.runtimeError = exc.msg
let responseData = serialize(response)
writeInt32Le(outputStream, int32(len(responseData)))
write(outputStream, responseData)
flush(outputStream)
|