blob: 9b0c7366400a61b07360e0239540f40208112abf (
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
|
import endians
import streams
import strformat
import protobuf/protobuf
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 = readInt32Le(inputStream)
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"
elif request.requestedOutputFormat == conformance_WireFormat.JSON:
response.skipped = "dont know how to output json"
elif hasJsonPayload(request):
response.skipped = "dont know how to parse json"
else:
try:
let parsed = newprotobuf_test_messages_proto3_TestAllTypesProto3(string(request.protobufPayload))
let ser = serialize(parsed)
response.protobufPayload = bytes(ser)
except IOError as exc:
response.parse_error = exc.msg
except ParseError as exc:
response.parse_error = exc.msg
except Exception as exc:
response.runtimeError = exc.msg
let responseData = serialize(response)
writeInt32Le(outputStream, int32(len(responseData)))
write(outputStream, responseData)
flush(outputStream)
|