From b02bd3aaffcdf9ca017f69506140d1e5a791b9ed Mon Sep 17 00:00:00 2001 From: Gustavo Cordova Avila Date: Mon, 25 Mar 2024 16:32:35 -0700 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ snake_case.nimble | 9 +++++++++ src/snake_case.nim | 35 +++++++++++++++++++++++++++++++++++ tests/config.nims | 1 + tests/test1_toSnakeCase.nim | 17 +++++++++++++++++ tests/test2_fromSnakeCase.nim | 17 +++++++++++++++++ 6 files changed, 81 insertions(+) create mode 100644 .gitignore create mode 100644 snake_case.nimble create mode 100644 src/snake_case.nim create mode 100644 tests/config.nims create mode 100644 tests/test1_toSnakeCase.nim create mode 100644 tests/test2_fromSnakeCase.nim diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bdbede7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Ignore the binary +snake_case diff --git a/snake_case.nimble b/snake_case.nimble new file mode 100644 index 0000000..80f8996 --- /dev/null +++ b/snake_case.nimble @@ -0,0 +1,9 @@ +# Package +version = "1.0.0" +author = "Gustavo Córdova Avila" +description = "Convert strings to/from SNAKE_CASE" +license = "Apache-2.0" +srcDir = "src" + +# Dependencies +requires "nim >= 2.0.0" diff --git a/src/snake_case.nim b/src/snake_case.nim new file mode 100644 index 0000000..bd50c8f --- /dev/null +++ b/src/snake_case.nim @@ -0,0 +1,35 @@ +## Convert strings to/from SNAKE_CASE + +proc toSnakeCase(str: string): string = + ## Convert a camelCase string to SNAKE_CASE + if str.len > 0: + var prv: char = '\0' + for ch in str: + if ch in {'A'..'Z'}: + if result.len > 0 and prv notin {'A'..'Z'}: + result.add '_' + result.add ch + elif ch in {'a'..'z'}: + result.add (ch.byte - 32).char + elif ch in {'0'..'9'}: + result.add ch + elif ch in {'-', '_', '.', '+'}: + if result.len > 0 and result[^1] != '_': + result.add '_' + +proc fromSnakeCase(str: string): string = + ## Convert from SNAKE_CASE to camelCase + var usc: bool = false + for ch in str: + if ch in {'A'..'Z'}: + if usc: + result.add ch + usc = false + else: + result.add (ch.byte + 32).char + elif ch in {'0'..'9', 'a'..'z'}: + result.add ch + elif ch in {'_', '-', '.', '+'}: + usc = true + +# Fin. diff --git a/tests/config.nims b/tests/config.nims new file mode 100644 index 0000000..3bb69f8 --- /dev/null +++ b/tests/config.nims @@ -0,0 +1 @@ +switch("path", "$projectDir/../src") \ No newline at end of file diff --git a/tests/test1_toSnakeCase.nim b/tests/test1_toSnakeCase.nim new file mode 100644 index 0000000..6f3b1ce --- /dev/null +++ b/tests/test1_toSnakeCase.nim @@ -0,0 +1,17 @@ +# This is just an example to get you started. You may wish to put all of your +# tests into a single file, or separate them into multiple `test1`, `test2` +# etc. files (better names are recommended, just make sure the name starts with +# the letter 't'). +# +# To run these tests, simply execute `nimble test`. + +import unittest +import snake_case + +test "toSnakeCase": + check "toSnakeCase".toSnakeCase() == "TO_SNAKE_CASE" + check "httpServerName".toSnakeCase() == "HTTP_SERVER_NAME" + check "portNum".toSnakeCase() == "PORT_NUM" + check "firstNameOnly".toSnakeCase() == "FIRST_NAME_ONLY" + check "rostr.token".toSnakeCase() == "ROSTR_TOKEN" + diff --git a/tests/test2_fromSnakeCase.nim b/tests/test2_fromSnakeCase.nim new file mode 100644 index 0000000..4203533 --- /dev/null +++ b/tests/test2_fromSnakeCase.nim @@ -0,0 +1,17 @@ +# This is just an example to get you started. You may wish to put all of your +# tests into a single file, or separate them into multiple `test1`, `test2` +# etc. files (better names are recommended, just make sure the name starts with +# the letter 't'). +# +# To run these tests, simply execute `nimble test`. + +import unittest +import snake_case + +test "fromSnakeCase": + check "TO_SNAKE_CASE".fromSnakeCase() == "toSnakeCase" + check "HTTP_SERVER_NAME".fromSnakeCase() == "httpServerName" + check "PORT_NUM".fromSnakeCase() == "portNum" + check "FIRST_NAME_ONLY".fromSnakeCase() == "firstNameOnly" + check "ROSTR_TOKEN".fromSnakeCase() == "rostrToken" +