diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-12 20:07:35 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-12 20:07:35 +0300 |
| commit | 3ffcfd52e6531788c2e0aa6d4d1f5e8f5658574e (patch) | |
| tree | 65897a37e665d31d54c35ebdd8abfe4116bd1324 | |
| parent | a43b55229d99090709ddd68a8f6eb27b80830cec (diff) | |
| download | nimpb-3ffcfd52e6531788c2e0aa6d4d1f5e8f5658574e.tar.gz nimpb-3ffcfd52e6531788c2e0aa6d4d1f5e8f5658574e.zip | |
Generate camelCase field names
| -rw-r--r-- | nimpb/compiler/generator.nim | 5 | ||||
| -rw-r--r-- | nimpb/utils.nim | 55 |
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 |
