Skip to content

Commit bbe1833

Browse files
committed
#1 - Support snake case parameters like :user-id
1 parent 5c76417 commit bbe1833

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

src/main/java/io/dinject/javlin/generator/Constants.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
class Constants {
44

5+
static final String IO_JAVALIN_CONTEXT = "io.javalin.Context";
6+
57
static final String SINGLETON = "javax.inject.Singleton";
68
static final String GENERATED = "javax.annotation.Generated";
79
static final String API_BUILDER = "io.javalin.apibuilder.ApiBuilder";
810

9-
static final String AT_GENERATED = "@Generated(\"io.dinject.web.javlin\")";
11+
static final String AT_GENERATED = "@Generated(\"io.dinject.javlin.generator\")";
1012

1113
static final String IMPORT_PATH_TYPE_CONVERT = "import static io.dinject.controller.PathTypeConversion.*;";
1214

src/main/java/io/dinject/javlin/generator/MethodParam.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,26 @@
55

66
class MethodParam {
77

8-
private static final String IO_JAVALIN_CONTEXT = "io.javalin.Context";
98
private final String rawType;
109
private final TypeHandler typeHandler;
1110
private final String name;
11+
private final String snakeName;
1212

1313

1414
MethodParam(VariableElement param) {
1515
this.name = param.getSimpleName().toString();
16+
this.snakeName = Util.snakeCase(name);
1617
this.rawType = param.asType().toString();
1718
this.typeHandler = TypeMap.get(rawType);
1819
}
1920

20-
private boolean isJavlinContext() {
21-
return IO_JAVALIN_CONTEXT.equals(rawType);
21+
private boolean isJavalinContext() {
22+
return Constants.IO_JAVALIN_CONTEXT.equals(rawType);
2223
}
2324

2425
void buildCtxGet(Append writer, Set<String> pathParams) {
2526

26-
if (isJavlinContext()) {
27+
if (isJavalinContext()) {
2728
// no conversion for this parameter
2829
return;
2930
}
@@ -39,16 +40,14 @@ void buildCtxGet(Append writer, Set<String> pathParams) {
3940

4041
// path parameters are expected to be not nullable
4142
// ... with query parameters nullable
42-
boolean isPathParam = pathParams.contains(name);
43-
44-
String asMethod = (typeHandler == null) ? null : (isPathParam) ? typeHandler.asMethod() : typeHandler.toMethod();
43+
String pathParameter = derivePathParam(pathParams);
44+
String asMethod = (typeHandler == null) ? null : (pathParameter != null) ? typeHandler.asMethod() : typeHandler.toMethod();
4545

4646
if (asMethod != null) {
4747
writer.append(asMethod);
4848
}
49-
if (isPathParam) {
50-
writer.append("ctx.pathParam(\"%s\")", name);
51-
49+
if (pathParameter != null) {
50+
writer.append("ctx.pathParam(\"%s\")", pathParameter);
5251
} else {
5352
if (typeHandler == null) {
5453
// assuming this is a body (POST, PATCH)
@@ -64,6 +63,16 @@ void buildCtxGet(Append writer, Set<String> pathParams) {
6463
writer.append(";").eol();
6564
}
6665

66+
private String derivePathParam(Set<String> pathParams) {
67+
if (pathParams.contains(name)) {
68+
return name;
69+
}
70+
if (pathParams.contains(snakeName)){
71+
return snakeName;
72+
}
73+
return null;
74+
}
75+
6776
void addImports(BeanReader bean) {
6877
if (typeHandler != null) {
6978
String importType = typeHandler.getImportType();
@@ -76,7 +85,7 @@ void addImports(BeanReader bean) {
7685
}
7786

7887
void buildParamName(Append writer) {
79-
if (isJavlinContext()) {
88+
if (isJavalinContext()) {
8089
writer.append("ctx");
8190
} else {
8291
writer.append(name);

src/main/java/io/dinject/javlin/generator/Util.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,23 @@ static String shortName(String fullType) {
4343
return fullType.substring(p + 1);
4444
}
4545
}
46+
47+
static String snakeCase(String name) {
48+
49+
StringBuilder sb = new StringBuilder(name.length() + 5);
50+
51+
int len = name.length();
52+
for (int i = 0; i < len; i++) {
53+
char ch = name.charAt(i);
54+
if (Character.isUpperCase(ch)) {
55+
if (i > 0) {
56+
sb.append("-");
57+
}
58+
sb.append(Character.toLowerCase(ch));
59+
} else {
60+
sb.append(ch);
61+
}
62+
}
63+
return sb.toString();
64+
}
4665
}

src/test/java/io/dinject/javlin/generator/UtilTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,16 @@ public void pathParams() {
3636
assertThat(Util.pathParams("/:id/odd:foo")).contains("id");
3737

3838
}
39+
40+
@Test
41+
public void snakeCase() {
42+
43+
assertThat(Util.snakeCase("lower")).isEqualTo("lower");
44+
assertThat(Util.snakeCase("fooId")).isEqualTo("foo-id");
45+
assertThat(Util.snakeCase("_fooId")).isEqualTo("_foo-id");
46+
assertThat(Util.snakeCase("fooBarBazUuid")).isEqualTo("foo-bar-baz-uuid");
47+
assertThat(Util.snakeCase("aDTo")).isEqualTo("a-d-to");
48+
assertThat(Util.snakeCase("DTo")).isEqualTo("d-to");
49+
assertThat(Util.snakeCase("_DTo")).isEqualTo("_-d-to");
50+
}
3951
}

0 commit comments

Comments
 (0)