diff options
author | Jakob Odersky <jakob@odersky.com> | 2018-04-19 20:56:27 -0700 |
---|---|---|
committer | Jakob Odersky <jakob@odersky.com> | 2018-04-19 20:56:27 -0700 |
commit | f57e5f96d657c422836f69faf55d8df3992ab3be (patch) | |
tree | a350049ef863479d62238d3b02b405dee2460ba0 /shared/src/main/scala/caseFormats.scala | |
parent | 4f239025c6185f551fc15ed34e2ddbcf0e0948e0 (diff) | |
download | spray-json-derivation-f57e5f96d657c422836f69faf55d8df3992ab3be.tar.gz spray-json-derivation-f57e5f96d657c422836f69faf55d8df3992ab3be.tar.bz2 spray-json-derivation-f57e5f96d657c422836f69faf55d8df3992ab3be.zip |
Add utility formats for modifying parameter name extraction
Diffstat (limited to 'shared/src/main/scala/caseFormats.scala')
-rw-r--r-- | shared/src/main/scala/caseFormats.scala | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/shared/src/main/scala/caseFormats.scala b/shared/src/main/scala/caseFormats.scala new file mode 100644 index 0000000..909e357 --- /dev/null +++ b/shared/src/main/scala/caseFormats.scala @@ -0,0 +1,47 @@ +package spray.json + +/** Serialize parametersOfCaseClasses as parameters_of_case_classes. */ +trait SnakeCase { self: DerivedFormats => + override def extractFieldName(paramName: String) = + FieldNaming.substituteCamel(paramName, '_') +} + +/** Serialize parametersOfCaseClasses as parameters-of-case-classes. */ +trait KebabCase { self: DerivedFormats => + override def extractFieldName(paramName: String) = + FieldNaming.substituteCamel(paramName, '-') +} + +object FieldNaming { + + @inline final private def isLower(ch: Char): Boolean = + ((ch & 0x20) != 0) || (ch == '_') + + @inline final def substituteCamel(paramName: String, substitute: Char) = { + val length = paramName.length + val builder = new StringBuilder(length) + var i = 0 + while (i < length) { + val cur = paramName(i) + val lower = isLower(cur) + if (lower) { + builder.append(cur) + } else { + builder.append((cur ^ 0x20).toChar) + } + if (lower && i + 1 < length) { + val next = paramName(i + 1) + if (!isLower(next)) { + builder.append(substitute) + builder.append((next ^ 0x20).toChar) + } else { + builder.append(next) + } + i += 1 + } + i += 1 + } + builder.result() + } + +} |