@@ -13,6 +13,7 @@ import com.google.devtools.ksp.processing.SymbolProcessorProvider
13
13
import com.google.devtools.ksp.symbol.FunctionKind
14
14
import com.google.devtools.ksp.symbol.KSAnnotated
15
15
import com.google.devtools.ksp.symbol.KSFunctionDeclaration
16
+ import com.google.devtools.ksp.symbol.KSType
16
17
import com.google.devtools.ksp.symbol.Visibility
17
18
import com.squareup.kotlinpoet.FileSpec
18
19
import com.squareup.kotlinpoet.FunSpec
@@ -85,22 +86,16 @@ private class RoutingProcessor(
85
86
.firstOrNull()
86
87
?.value
87
88
? : paramName
88
- check(routeAnnotation.path.contains(" {$customName }" )) {
89
+ val isOptional = routeAnnotation.path.contains(" {$customName ?}" )
90
+ val isRequired = routeAnnotation.path.contains(" {$customName }" )
91
+ check(isOptional || isRequired) {
89
92
" '$qualifiedName ' has parameter '$paramName ' that is not declared as path parameter {$customName }"
90
93
}
91
-
92
- val parsed = """ $paramName = %M.parameters["$customName "]!!"""
93
- parameters + = when (param.type.resolve()) {
94
- resolver.builtIns.booleanType -> " $parsed .toBoolean()"
95
- resolver.builtIns.byteType -> " $parsed .toByte()"
96
- resolver.builtIns.charType -> " $parsed [0]"
97
- resolver.builtIns.doubleType -> " $parsed .toDouble()"
98
- resolver.builtIns.floatType -> " $parsed .toFloat()"
99
- resolver.builtIns.intType -> " $parsed .toInt()"
100
- resolver.builtIns.longType -> " $parsed .toInt()"
101
- resolver.builtIns.shortType -> " $parsed .toInt()"
102
- resolver.builtIns.stringType -> parsed
103
- else -> error(" Path parameters must be primitive type only" )
94
+ val paramType = param.type.resolve()
95
+ val parsed = """ $paramName = %M.parameters["$customName "]"""
96
+ parameters + = when {
97
+ isOptional -> optionalParse(paramType, resolver, parsed)
98
+ else -> requiredParse(paramType, resolver, parsed)
104
99
}
105
100
}
106
101
@@ -133,4 +128,38 @@ private class RoutingProcessor(
133
128
return emptyList()
134
129
}
135
130
131
+ private fun optionalParse (
132
+ paramType : KSType ,
133
+ resolver : Resolver ,
134
+ parsed : String
135
+ ) = when (paramType) {
136
+ resolver.builtIns.booleanType.makeNullable() -> " $parsed ?.toBooleanOrNull()"
137
+ resolver.builtIns.byteType.makeNullable() -> " $parsed ?.toByteOrNull()"
138
+ resolver.builtIns.charType.makeNullable() -> " $parsed ?.firstOrNull()"
139
+ resolver.builtIns.doubleType.makeNullable() -> " $parsed ?.toDoubleOrNull()"
140
+ resolver.builtIns.floatType.makeNullable() -> " $parsed ?.toFloatOrNull()"
141
+ resolver.builtIns.intType.makeNullable() -> " $parsed ?.toIntOrNull()"
142
+ resolver.builtIns.longType.makeNullable() -> " $parsed ?.toLongOrNull()"
143
+ resolver.builtIns.shortType.makeNullable() -> " $parsed ?.toShortOrNull()"
144
+ resolver.builtIns.stringType.makeNullable() -> parsed
145
+ else -> error(" Path parameters must be primitive type only" )
146
+ }
147
+
148
+ private fun requiredParse (
149
+ paramType : KSType ,
150
+ resolver : Resolver ,
151
+ parsed : String
152
+ ) = when (paramType) {
153
+ resolver.builtIns.booleanType -> " $parsed !!.toBoolean()"
154
+ resolver.builtIns.byteType -> " $parsed !!.toByte()"
155
+ resolver.builtIns.charType -> " $parsed !!.first()"
156
+ resolver.builtIns.doubleType -> " $parsed !!.toDouble()"
157
+ resolver.builtIns.floatType -> " $parsed !!.toFloat()"
158
+ resolver.builtIns.intType -> " $parsed !!.toInt()"
159
+ resolver.builtIns.longType -> " $parsed !!.toLong()"
160
+ resolver.builtIns.shortType -> " $parsed !!.toShort()"
161
+ resolver.builtIns.stringType -> " $parsed !!"
162
+ else -> optionalParse(paramType, resolver, parsed)
163
+ }
164
+
136
165
}
0 commit comments