aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-27 20:01:53 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-27 20:01:53 +0300
commitd2925ec9864ecfa349ec2bc34706396814df34ce (patch)
treedd3a1177a8d76056e45b491b9ae9bfd8b69ede04
parent03e592b13370791a0839615257d4c57a3eb0bee8 (diff)
downloadnimpb-d2925ec9864ecfa349ec2bc34706396814df34ce.tar.gz
nimpb-d2925ec9864ecfa349ec2bc34706396814df34ce.zip
Fix JSON parsing of FieldMask
The camelcasing proc was not implemented so conformance suite didn't like us.
-rw-r--r--nimpb/wkt/field_mask.nim19
1 files changed, 15 insertions, 4 deletions
diff --git a/nimpb/wkt/field_mask.nim b/nimpb/wkt/field_mask.nim
index 6e5fcba..72f541b 100644
--- a/nimpb/wkt/field_mask.nim
+++ b/nimpb/wkt/field_mask.nim
@@ -31,8 +31,16 @@ proc snakeCaseToCamelCase(s: string): string =
raise newException(ValueError, "trailing underscore")
proc camelCaseToSnakeCase(s: string): string =
- # TODO
- result = s
+ # Nimification from https://github.com/google/protobuf/blob/master/src/google/protobuf/util/field_mask_util.cc
+ result = newStringOfCap(len(s) * 2)
+ for ch in s:
+ if ch == '_':
+ raise newException(ValueError, "unexpected underscore")
+ if isUpperAscii(ch):
+ add(result, '_')
+ add(result, toLowerAscii(ch))
+ else:
+ add(result, ch)
proc toJson*(message: google_protobuf_FieldMask): JsonNode =
var resultString = ""
@@ -51,5 +59,8 @@ proc parsegoogle_protobuf_FieldMask*(node: JsonNode): google_protobuf_FieldMask
result = newgoogle_protobuf_FieldMask()
result.paths = @[]
- for path in split(node.str, ","):
- addPaths(result, camelCaseToSnakeCase(path))
+ try:
+ for path in split(node.str, ","):
+ addPaths(result, camelCaseToSnakeCase(path))
+ except ValueError as exc:
+ raise newException(nimpb_json.ParseError, exc.msg)