aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-25 20:24:06 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-25 20:24:06 +0300
commit1190e18cc36e46f34c41c77d7d8b1f4bd6bbbebf (patch)
tree58d87e53d42484c456698b71c140efa1deb88b3e
parentef73b76a31dd1ea030e23921960c3096b936a8d5 (diff)
downloadnimpb-1190e18cc36e46f34c41c77d7d8b1f4bd6bbbebf.tar.gz
nimpb-1190e18cc36e46f34c41c77d7d8b1f4bd6bbbebf.zip
Move WKT JSON support procs to their own files
-rw-r--r--nimpb/compiler/generator.nim17
-rw-r--r--nimpb/json.nim178
-rw-r--r--nimpb/wkt/any.nim49
-rw-r--r--nimpb/wkt/duration.nim29
-rw-r--r--nimpb/wkt/field_mask.nim7
-rw-r--r--nimpb/wkt/struct.nim36
-rw-r--r--nimpb/wkt/timestamp.nim19
-rw-r--r--nimpb/wkt/type_pb.nim2
-rw-r--r--nimpb/wkt/wrappers.nim57
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()