diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-26 18:25:57 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-26 18:25:57 +0300 |
| commit | 0a57c608958491d32365e807f943daa3ea3e3b87 (patch) | |
| tree | dd97aea105916a67990f7639e463d8dcf4577bbc | |
| parent | 629d7f0fe2ab9b20f14da11acfb6819176267e44 (diff) | |
| download | nimpb-0a57c608958491d32365e807f943daa3ea3e3b87.tar.gz nimpb-0a57c608958491d32365e807f943daa3ea3e3b87.zip | |
Fixes to FieldMask serialization
Basically just being more strict about the paths than before.
| -rw-r--r-- | nimpb/wkt/field_mask.nim | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/nimpb/wkt/field_mask.nim b/nimpb/wkt/field_mask.nim index fd38cfb..fb8d04f 100644 --- a/nimpb/wkt/field_mask.nim +++ b/nimpb/wkt/field_mask.nim @@ -3,5 +3,43 @@ import strutils include field_mask_pb +const + LowerCaseLetters = {'a'..'z'} + +proc snakeCaseToCamelCase(s: string): string = + # Nimification from https://github.com/google/protobuf/blob/master/src/google/protobuf/util/field_mask_util.cc + result = newStringOfCap(len(s)) + + var afterUnderscore = false + + for ch in s: + if isUpperAscii(ch): + raise newException(ValueError, "string not in snake case") + + if afterUnderscore: + if ch in LowerCaseLetters: + add(result, toUpperAscii(ch)) + afterUnderscore = false + else: + raise newException(ValueError, "lower case expected after underscore") + elif ch == '_': + afterUnderscore = true + else: + add(result, ch) + + if afterUnderscore: + raise newException(ValueError, "trailing underscore") + +proc camelCaseToSnakeCase(s: string): string = + # TODO + result = s + proc toJson*(message: google_protobuf_FieldMask): JsonNode = - %join(message.paths, ",") + var resultString = "" + + for index, path in message.paths: + add(resultString, snakeCaseToCamelCase(path)) + if index < len(message.paths)-1: + add(resultString, ",") + + result = %resultString |
