aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-12 20:07:35 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-12 20:07:35 +0300
commit3ffcfd52e6531788c2e0aa6d4d1f5e8f5658574e (patch)
tree65897a37e665d31d54c35ebdd8abfe4116bd1324
parenta43b55229d99090709ddd68a8f6eb27b80830cec (diff)
downloadnimpb-3ffcfd52e6531788c2e0aa6d4d1f5e8f5658574e.tar.gz
nimpb-3ffcfd52e6531788c2e0aa6d4d1f5e8f5658574e.zip
Generate camelCase field names
-rw-r--r--nimpb/compiler/generator.nim5
-rw-r--r--nimpb/utils.nim55
2 files changed, 58 insertions, 2 deletions
diff --git a/nimpb/compiler/generator.nim b/nimpb/compiler/generator.nim
index fd820dd..5c4000a 100644
--- a/nimpb/compiler/generator.nim
+++ b/nimpb/compiler/generator.nim
@@ -8,6 +8,7 @@ import strutils
import tables
import nimpb/wkt/descriptor_pb
+import nimpb/utils
import ../nimpb
@@ -303,7 +304,7 @@ proc sizeOfProc(field: Field): string =
proc newField(file: ProtoFile, message: Message, desc: google_protobuf_FieldDescriptorProto): Field =
new(result)
- result.name = desc.name
+ result.name = toCamelCase(desc.name)
result.number = desc.number
result.label = desc.label
result.ftype = desc.ftype
@@ -359,7 +360,7 @@ proc newField(file: ProtoFile, message: Message, desc: google_protobuf_FieldDesc
proc newOneof(name: string): Oneof =
new(result)
result.fields = @[]
- result.name = name
+ result.name = toCamelCase(name)
proc newMessage(file: ProtoFile, names: Names, desc: google_protobuf_DescriptorProto): Message =
new(result)
diff --git a/nimpb/utils.nim b/nimpb/utils.nim
new file mode 100644
index 0000000..8220ef2
--- /dev/null
+++ b/nimpb/utils.nim
@@ -0,0 +1,55 @@
+import strutils
+
+proc toCamelCase*(s: string): string =
+ ## Nimification of ToCamelCase() from
+ ## protobuf/src/google/protobuf/util/internal/utility.cc
+ result = newStringOfCap(len(s))
+
+ var
+ capitalizeNext = false
+ wasCapital = false
+ isCapital = false
+ firstWord = true
+
+ for index in 0..len(s)-1:
+ let ch = s[index]
+ wasCapital = isCapital
+ isCapital = isUpperAscii(ch)
+ if ch == '_':
+ capitalizeNext = true
+ if len(result) > 0:
+ firstWord = false
+ elif firstWord:
+ if len(result) > 0 and isCapital and (not wasCapital or (index+1 < len(s) and isLowerAscii(s[index+1]))):
+ firstWord = false
+ add(result, ch)
+ else:
+ add(result, toLowerAscii(ch))
+ elif capitalizeNext:
+ capitalizeNext = false
+ add(result, toUpperAscii(ch))
+ else:
+ add(result, toLowerAscii(ch))
+
+proc toSnakeCase*(s: string): string =
+ ## Nimification of ToSnakeCase() from
+ ## protobuf/src/google/protobuf/util/internal/utility.cc
+ result = newStringOfCap(len(s) * 2)
+
+ var
+ wasNotUnderscore = false
+ wasNotCap = false
+
+ for index in 0..len(s)-1:
+ if isUpperAscii(s[index]):
+ if wasNotUnderscore and
+ (wasNotCap or
+ (index+1 < len(s) and isLowerAscii(s[index+1]))):
+ add(result, '_')
+ add(result, toLowerAscii(s[index]))
+ wasNotUnderscore = true
+ wasNotCap = false
+ else:
+ add(result, s[index])
+ wasNotUnderscore = s[index] != '_'
+ wasNotCap = true