diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-25 20:24:06 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-25 20:24:06 +0300 |
| commit | 1190e18cc36e46f34c41c77d7d8b1f4bd6bbbebf (patch) | |
| tree | 58d87e53d42484c456698b71c140efa1deb88b3e | |
| parent | ef73b76a31dd1ea030e23921960c3096b936a8d5 (diff) | |
| download | nimpb-1190e18cc36e46f34c41c77d7d8b1f4bd6bbbebf.tar.gz nimpb-1190e18cc36e46f34c41c77d7d8b1f4bd6bbbebf.zip | |
Move WKT JSON support procs to their own files
| -rw-r--r-- | nimpb/compiler/generator.nim | 17 | ||||
| -rw-r--r-- | nimpb/json.nim | 178 | ||||
| -rw-r--r-- | nimpb/wkt/any.nim | 49 | ||||
| -rw-r--r-- | nimpb/wkt/duration.nim | 29 | ||||
| -rw-r--r-- | nimpb/wkt/field_mask.nim | 7 | ||||
| -rw-r--r-- | nimpb/wkt/struct.nim | 36 | ||||
| -rw-r--r-- | nimpb/wkt/timestamp.nim | 19 | ||||
| -rw-r--r-- | nimpb/wkt/type_pb.nim | 2 | ||||
| -rw-r--r-- | nimpb/wkt/wrappers.nim | 57 |
9 files changed, 213 insertions, 181 deletions
diff --git a/nimpb/compiler/generator.nim b/nimpb/compiler/generator.nim index aa1990c..bd543a7 100644 --- a/nimpb/compiler/generator.nim +++ b/nimpb/compiler/generator.nim @@ -91,6 +91,16 @@ type clientStreaming*: bool serverStreaming*: bool +const + WktsWithExtras = [ + "any", + "duration", + "field_mask", + "struct", + "timestamp", + "wrappers", + ] + when defined(debug): proc log(msg: string) = stderr.write(msg) @@ -1069,9 +1079,12 @@ proc processFile(fdesc: google_protobuf_FileDescriptorProto, if dir == "google/protobuf": dir = "nimpb/wkt" + if depname notin WktsWithExtras: + depname &= "_pb" + else: + depname &= "_pb" - var deppbname = (dir / depname) & "_pb" - addLine(pbFile.data, &"import {deppbname}") + addLine(pbFile.data, &"import {dir / depname}") if hasDependency(fdesc): addLine(pbFile.data, "") diff --git a/nimpb/json.nim b/nimpb/json.nim index 5b889d3..881f41e 100644 --- a/nimpb/json.nim +++ b/nimpb/json.nim @@ -4,15 +4,6 @@ import std/json import strutils import times -import nimpb - -import wkt/duration_pb -import wkt/timestamp_pb -import wkt/wrappers_pb -import wkt/field_mask_pb -import wkt/struct_pb -import wkt/any_pb - proc `%`*(u: uint32): JsonNode = newJFloat(float(u)) @@ -38,172 +29,3 @@ proc toJson*(value: int64): JsonNode = proc toJson*(value: uint64): JsonNode = newJString($value) - -proc toJson*(message: google_protobuf_DoubleValue): JsonNode = - if hasValue(message): - result = toJson(message.value) - else: - result = newJNull() - -proc toJson*(message: google_protobuf_FloatValue): JsonNode = - if hasValue(message): - result = toJson(message.value) - else: - result = newJNull() - -proc toJson*(message: google_protobuf_Int64Value): JsonNode = - if hasValue(message): - result = toJson(message.value) - else: - result = newJNull() - -proc toJson*(message: google_protobuf_UInt64Value): JsonNode = - if hasValue(message): - result = toJson(message.value) - else: - result = newJNull() - -proc toJson*(message: google_protobuf_Int32Value): JsonNode = - if hasValue(message): - result = %message.value - else: - result = newJNull() - -proc toJson*(message: google_protobuf_UInt32Value): JsonNode = - if hasValue(message): - result = %message.value - else: - result = newJNull() - -proc toJson*(message: google_protobuf_BoolValue): JsonNode = - if hasValue(message): - result = %message.value - else: - result = newJNull() - -proc toJson*(message: google_protobuf_StringValue): JsonNode = - if hasValue(message): - result = %message.value - else: - result = newJNull() - -proc toJson*(message: google_protobuf_BytesValue): JsonNode = - if hasValue(message): - result = %message.value - else: - result = newJNull() - -proc toJson*(message: google_protobuf_Duration): JsonNode = - if (message.seconds < -315_576_000_000'i64) or - (message.seconds > 315_576_000_000'i64): - raise newException(ValueError, "seconds out of bounds") - - if (message.nanos < -999_999_999'i32) or - (message.nanos > 999_999_999'i32): - raise newException(ValueError, "nanos out of bounds") - - if message.seconds != 0: - if sgn(message.seconds) != sgn(message.nanos): - raise newException(ValueError, "different sign for seconds and nanos") - - var s = $message.seconds - - if message.nanos != 0: - add(s, ".") - add(s, intToStr(message.nanos, 9)) - removeSuffix(s, '0') - - add(s, "s") - - result = %s - -proc toJson*(message: google_protobuf_Timestamp): JsonNode = - let t = utc(fromUnix(message.seconds)) - - if t.year < 1 or t.year > 9999: - raise newException(ValueError, "invalid timestamp") - - var s = format(t, "yyyy-MM-dd'T'HH:mm:ss") - if message.nanos != 0: - add(s, ".") - add(s, intToStr(message.nanos, 9)) - removeSuffix(s, '0') - add(s, "Z") - result = %s - -proc toJson*(message: google_protobuf_FieldMask): JsonNode = - %join(message.paths, ",") - -proc toJson*(message: google_protobuf_Value): JsonNode - -proc toJson*(message: google_protobuf_Struct): JsonNode = - result = newJObject() - for key, value in message.fields: - result[key] = toJson(value) - -proc toJson*(message: google_protobuf_ListValue): JsonNode - -proc toJson*(message: google_protobuf_Value): JsonNode = - if hasNullValue(message): - result = newJNull() - elif hasNumberValue(message): - result = toJson(message.numberValue) - elif hasStringValue(message): - result = %message.stringValue - elif hasBoolValue(message): - result = %message.boolValue - elif hasStructValue(message): - result = toJson(message.structValue) - elif hasListValue(message): - result = toJson(message.listValue) - else: - raise newException(ValueError, "no field set") - -proc toJson*(message: google_protobuf_NullValue): JsonNode = - newJNull() - -proc toJson*(message: google_protobuf_ListValue): JsonNode = - result = newJArray() - for value in message.values: - add(result, toJson(value)) - -proc toJson*(message: google_protobuf_Any): JsonNode = - case message.typeUrl - of "type.googleapis.com/google.protobuf.Duration": - let duration = newGoogleProtobufDuration(message.value) - result = newJObject() - result["@type"] = %message.typeUrl - result["value"] = toJson(duration) - of "type.googleapis.com/google.protobuf.Empty": - result = newJObject() - result["@type"] = %message.typeUrl - result["value"] = newJObject() - of "type.googleapis.com/google.protobuf.FieldMask": - let mask = newGoogleProtobufFieldMask(message.value) - result = newJObject() - result["@type"] = %message.typeUrl - result["value"] = toJson(mask) - of "type.googleapis.com/google.protobuf.Struct": - let struct = newGoogleProtobufStruct(message.value) - result = newJObject() - result["@type"] = %message.typeUrl - result["value"] = toJson(struct) - of "type.googleapis.com/google.protobuf.Value": - let value = newGoogleProtobufValue(message.value) - result = newJObject() - result["@type"] = %message.typeUrl - result["value"] = toJson(value) - of "type.googleapis.com/google.protobuf.ListValue": - let lst = newGoogleProtobufListValue(message.value) - result = newJObject() - result["@type"] = %message.typeUrl - result["value"] = toJson(lst) - of "type.googleapis.com/google.protobuf.Timestamp": - let value = newGoogleProtobufTimestamp(message.value) - result = newJObject() - result["@type"] = %message.typeUrl - result["value"] = toJson(value) - else: - result = newJObject() - result["typeUrl"] = %message.typeUrl - result["value"] = %message.value diff --git a/nimpb/wkt/any.nim b/nimpb/wkt/any.nim new file mode 100644 index 0000000..1b67130 --- /dev/null +++ b/nimpb/wkt/any.nim @@ -0,0 +1,49 @@ +import json + +import duration +import field_mask +import struct +import timestamp + +include any_pb + +proc toJson*(message: google_protobuf_Any): JsonNode = + case message.typeUrl + of "type.googleapis.com/google.protobuf.Duration": + let duration = newGoogleProtobufDuration(message.value) + result = newJObject() + result["@type"] = %message.typeUrl + result["value"] = toJson(duration) + of "type.googleapis.com/google.protobuf.Empty": + result = newJObject() + result["@type"] = %message.typeUrl + result["value"] = newJObject() + of "type.googleapis.com/google.protobuf.FieldMask": + let mask = newGoogleProtobufFieldMask(message.value) + result = newJObject() + result["@type"] = %message.typeUrl + result["value"] = toJson(mask) + of "type.googleapis.com/google.protobuf.Struct": + let struct = newGoogleProtobufStruct(message.value) + result = newJObject() + result["@type"] = %message.typeUrl + result["value"] = toJson(struct) + of "type.googleapis.com/google.protobuf.Value": + let value = newGoogleProtobufValue(message.value) + result = newJObject() + result["@type"] = %message.typeUrl + result["value"] = toJson(value) + of "type.googleapis.com/google.protobuf.ListValue": + let lst = newGoogleProtobufListValue(message.value) + result = newJObject() + result["@type"] = %message.typeUrl + result["value"] = toJson(lst) + of "type.googleapis.com/google.protobuf.Timestamp": + let value = newGoogleProtobufTimestamp(message.value) + result = newJObject() + result["@type"] = %message.typeUrl + result["value"] = toJson(value) + else: + result = newJObject() + result["typeUrl"] = %message.typeUrl + result["value"] = %message.value diff --git a/nimpb/wkt/duration.nim b/nimpb/wkt/duration.nim new file mode 100644 index 0000000..98c8afb --- /dev/null +++ b/nimpb/wkt/duration.nim @@ -0,0 +1,29 @@ +import json +import math +import strutils + +include duration_pb + +proc toJson*(message: google_protobuf_Duration): JsonNode = + if (message.seconds < -315_576_000_000'i64) or + (message.seconds > 315_576_000_000'i64): + raise newException(ValueError, "seconds out of bounds") + + if (message.nanos < -999_999_999'i32) or + (message.nanos > 999_999_999'i32): + raise newException(ValueError, "nanos out of bounds") + + if message.seconds != 0: + if sgn(message.seconds) != sgn(message.nanos): + raise newException(ValueError, "different sign for seconds and nanos") + + var s = $message.seconds + + if message.nanos != 0: + add(s, ".") + add(s, intToStr(message.nanos, 9)) + removeSuffix(s, '0') + + add(s, "s") + + result = %s diff --git a/nimpb/wkt/field_mask.nim b/nimpb/wkt/field_mask.nim new file mode 100644 index 0000000..fd38cfb --- /dev/null +++ b/nimpb/wkt/field_mask.nim @@ -0,0 +1,7 @@ +import json +import strutils + +include field_mask_pb + +proc toJson*(message: google_protobuf_FieldMask): JsonNode = + %join(message.paths, ",") diff --git a/nimpb/wkt/struct.nim b/nimpb/wkt/struct.nim new file mode 100644 index 0000000..bfeca0b --- /dev/null +++ b/nimpb/wkt/struct.nim @@ -0,0 +1,36 @@ +import json + +include struct_pb + +proc toJson*(message: google_protobuf_Value): JsonNode + +proc toJson*(message: google_protobuf_ListValue): JsonNode + +proc toJson*(message: google_protobuf_Struct): JsonNode = + result = newJObject() + for key, value in message.fields: + result[key] = toJson(value) + +proc toJson*(message: google_protobuf_Value): JsonNode = + if hasNullValue(message): + result = newJNull() + elif hasNumberValue(message): + result = toJson(message.numberValue) + elif hasStringValue(message): + result = %message.stringValue + elif hasBoolValue(message): + result = %message.boolValue + elif hasStructValue(message): + result = toJson(message.structValue) + elif hasListValue(message): + result = toJson(message.listValue) + else: + raise newException(ValueError, "no field set") + +proc toJson*(message: google_protobuf_NullValue): JsonNode = + newJNull() + +proc toJson*(message: google_protobuf_ListValue): JsonNode = + result = newJArray() + for value in message.values: + add(result, toJson(value)) diff --git a/nimpb/wkt/timestamp.nim b/nimpb/wkt/timestamp.nim new file mode 100644 index 0000000..52726e6 --- /dev/null +++ b/nimpb/wkt/timestamp.nim @@ -0,0 +1,19 @@ +import json +import strutils +import times + +include timestamp_pb + +proc toJson*(message: google_protobuf_Timestamp): JsonNode = + let t = utc(fromUnix(message.seconds)) + + if t.year < 1 or t.year > 9999: + raise newException(ValueError, "invalid timestamp") + + var s = format(t, "yyyy-MM-dd'T'HH:mm:ss") + if message.nanos != 0: + add(s, ".") + add(s, intToStr(message.nanos, 9)) + removeSuffix(s, '0') + add(s, "Z") + result = %s diff --git a/nimpb/wkt/type_pb.nim b/nimpb/wkt/type_pb.nim index 2461c3a..9f60b1a 100644 --- a/nimpb/wkt/type_pb.nim +++ b/nimpb/wkt/type_pb.nim @@ -7,7 +7,7 @@ import json import nimpb/nimpb import nimpb/json as nimpb_json -import nimpb/wkt/any_pb +import nimpb/wkt/any import nimpb/wkt/source_context_pb type diff --git a/nimpb/wkt/wrappers.nim b/nimpb/wkt/wrappers.nim new file mode 100644 index 0000000..12d58bc --- /dev/null +++ b/nimpb/wkt/wrappers.nim @@ -0,0 +1,57 @@ +import json + +include wrappers_pb + +proc toJson*(message: google_protobuf_DoubleValue): JsonNode = + if hasValue(message): + result = toJson(message.value) + else: + result = newJNull() + +proc toJson*(message: google_protobuf_FloatValue): JsonNode = + if hasValue(message): + result = toJson(message.value) + else: + result = newJNull() + +proc toJson*(message: google_protobuf_Int64Value): JsonNode = + if hasValue(message): + result = toJson(message.value) + else: + result = newJNull() + +proc toJson*(message: google_protobuf_UInt64Value): JsonNode = + if hasValue(message): + result = toJson(message.value) + else: + result = newJNull() + +proc toJson*(message: google_protobuf_Int32Value): JsonNode = + if hasValue(message): + result = %message.value + else: + result = newJNull() + +proc toJson*(message: google_protobuf_UInt32Value): JsonNode = + if hasValue(message): + result = %message.value + else: + result = newJNull() + +proc toJson*(message: google_protobuf_BoolValue): JsonNode = + if hasValue(message): + result = %message.value + else: + result = newJNull() + +proc toJson*(message: google_protobuf_StringValue): JsonNode = + if hasValue(message): + result = %message.value + else: + result = newJNull() + +proc toJson*(message: google_protobuf_BytesValue): JsonNode = + if hasValue(message): + result = %message.value + else: + result = newJNull() |
