Skip to content

Commit 142a2d0

Browse files
committed
Finished Path Param Parsers
Removed unclean code
1 parent edfe862 commit 142a2d0

35 files changed

+207
-467
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.papsign.ktor.openapigen.parameters
22

3+
import com.papsign.ktor.openapigen.parameters.parsers.builders.Builder
4+
import com.papsign.ktor.openapigen.parameters.parsers.builders.BuilderFactory
5+
36
interface ParameterStyle<S> where S: ParameterStyle<S>, S: Enum<S> {
47
val name: String
8+
val factory: BuilderFactory<Builder<S>, S>
59
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package com.papsign.ktor.openapigen.parameters
22

3+
import com.papsign.ktor.openapigen.parameters.parsers.builders.Builder
4+
import com.papsign.ktor.openapigen.parameters.parsers.builders.BuilderFactory
5+
import com.papsign.ktor.openapigen.parameters.parsers.builders.path.label.MatrixBuilderFactory
6+
import com.papsign.ktor.openapigen.parameters.parsers.builders.path.matrix.LabelBuilderFactory
7+
import com.papsign.ktor.openapigen.parameters.parsers.builders.path.simple.SimpleBuilderFactory
38

4-
enum class PathParamStyle: ParameterStyle<PathParamStyle> {
5-
DEFAULT, simple, label, matrix
9+
10+
enum class PathParamStyle(override val factory: BuilderFactory<Builder<PathParamStyle>, PathParamStyle>): ParameterStyle<PathParamStyle> {
11+
simple(SimpleBuilderFactory), label(LabelBuilderFactory), matrix(MatrixBuilderFactory)
612
}
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package com.papsign.ktor.openapigen.parameters
22

3-
enum class QueryParamStyle: ParameterStyle<QueryParamStyle> {
4-
DEFAULT, form, spaceDelimited, pipeDelimited, deepObject
3+
import com.papsign.ktor.openapigen.parameters.parsers.builders.Builder
4+
import com.papsign.ktor.openapigen.parameters.parsers.builders.BuilderFactory
5+
import com.papsign.ktor.openapigen.parameters.parsers.builders.query.deepobject.DeepBuilderFactory
6+
import com.papsign.ktor.openapigen.parameters.parsers.builders.query.delimited.PipeDelimitedBuilderFactory
7+
import com.papsign.ktor.openapigen.parameters.parsers.builders.query.delimited.SpaceDelimitedBuilderFactory
8+
import com.papsign.ktor.openapigen.parameters.parsers.builders.query.form.FormBuilderFactory
9+
10+
enum class QueryParamStyle(override val factory: BuilderFactory<Builder<QueryParamStyle>, QueryParamStyle>): ParameterStyle<QueryParamStyle> {
11+
form(FormBuilderFactory), spaceDelimited(SpaceDelimitedBuilderFactory), pipeDelimited(PipeDelimitedBuilderFactory), deepObject(DeepBuilderFactory)
512
}

src/main/kotlin/com/papsign/ktor/openapigen/parameters/handlers/ModularParameterHander.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ import com.papsign.ktor.openapigen.modules.ModuleProvider
88
import com.papsign.ktor.openapigen.openapi.Parameter
99
import com.papsign.ktor.openapigen.openapi.ParameterLocation
1010
import com.papsign.ktor.openapigen.openapi.Schema
11-
import com.papsign.ktor.openapigen.parameters.parsers.ParameterParser
11+
import com.papsign.ktor.openapigen.parameters.parsers.builders.Builder
1212
import io.ktor.http.Parameters
13+
import io.ktor.util.toMap
1314
import kotlin.reflect.KFunction
1415
import kotlin.reflect.KParameter
1516
import kotlin.reflect.full.findAnnotation
1617

17-
class ModularParameterHander<T>(val parsers: Map<KParameter, ParameterParser>, val constructor: KFunction<T>) :
18+
class ModularParameterHander<T>(val parsers: Map<KParameter, Builder<*>>, val constructor: KFunction<T>) :
1819
ParameterHandler<T> {
1920

2021
override fun parse(parameters: Parameters): T {
21-
return constructor.callBy(parsers.mapValues { it.value.parse(parameters) })
22+
return constructor.callBy(parsers.mapValues { it.value.build(it.key.name!!, parameters.toMap()) })
2223
}
2324

2425
override fun getParameters(apiGen: OpenAPIGen, provider: ModuleProvider<*>): List<Parameter<*>> {
@@ -40,7 +41,7 @@ class ModularParameterHander<T>(val parsers: Map<KParameter, ParameterParser>, v
4041
it.description = description
4142
it.allowEmptyValue = allowEmptyValues
4243
it.deprecated = deprecated
43-
it.style = parser.queryStyle
44+
it.style = parser.style
4445
it.explode = parser.explode
4546
}
4647
}
@@ -50,7 +51,7 @@ class ModularParameterHander<T>(val parsers: Map<KParameter, ParameterParser>, v
5051
return createParam(param, apiParam.`in`) {
5152
it.description = description
5253
it.deprecated = deprecated
53-
it.style = parser.pathStyle
54+
it.style = parser.style
5455
it.explode = parser.explode
5556
}
5657
}

src/main/kotlin/com/papsign/ktor/openapigen/parameters/parsers/CollectionParameterParser.kt

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/main/kotlin/com/papsign/ktor/openapigen/parameters/parsers/EnumParameterParser.kt

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/main/kotlin/com/papsign/ktor/openapigen/parameters/parsers/InfoParameterParser.kt

Lines changed: 0 additions & 61 deletions
This file was deleted.

src/main/kotlin/com/papsign/ktor/openapigen/parameters/parsers/ObjectParameterParser.kt

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/main/kotlin/com/papsign/ktor/openapigen/parameters/parsers/ParameterParser.kt

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/main/kotlin/com/papsign/ktor/openapigen/parameters/parsers/PrimitiveParameterParser.kt

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/main/kotlin/com/papsign/ktor/openapigen/parameters/parsers/builders/BuilderSelector.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ import kotlin.reflect.KType
44

55
interface BuilderSelector<out T: Builder<*>> {
66
fun canHandle(type: KType, explode: Boolean): Boolean
7-
fun create(type: KType, exploded: Boolean): T
7+
fun create(type: KType, explode: Boolean): T
88
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.papsign.ktor.openapigen.parameters.parsers.builders.path.label
2+
3+
import com.papsign.ktor.openapigen.parameters.PathParamStyle
4+
import com.papsign.ktor.openapigen.parameters.parsers.builders.Builder
5+
import com.papsign.ktor.openapigen.parameters.parsers.builders.BuilderSelector
6+
import com.papsign.ktor.openapigen.parameters.parsers.converters.Converter
7+
import com.papsign.ktor.openapigen.parameters.parsers.converters.ConverterFactory
8+
import com.papsign.ktor.openapigen.parameters.parsers.converters.`object`.MappedConverter
9+
import com.papsign.ktor.openapigen.parameters.parsers.converters.collection.ListedConverter
10+
import kotlin.reflect.KType
11+
12+
class MatrixBuilder(type: KType, override val explode: Boolean): Builder<PathParamStyle> {
13+
override val style: PathParamStyle = PathParamStyle.label
14+
15+
private val converter: Converter = ConverterFactory.buildConverterForced(type)
16+
17+
override fun build(key: String, parameters: Map<String, List<String>>): Any? {
18+
val value = parameters[key]?.let { it[0] } ?: return null
19+
return if (explode) {
20+
val groups = value.removePrefix(";").split(';').map { it.split('=').let { Pair(it[0], it.getOrElse(1){""}) } }
21+
when (converter) {
22+
is MappedConverter -> converter.convert(groups.toMap())
23+
is ListedConverter -> converter.convert(groups.map { it.second })
24+
else -> converter.convert(groups.first().second)
25+
}
26+
} else {
27+
converter.convert(value.removePrefix(";$key="))
28+
}
29+
}
30+
31+
companion object: BuilderSelector<MatrixBuilder> {
32+
override fun canHandle(type: KType, explode: Boolean): Boolean {
33+
return true
34+
}
35+
36+
override fun create(type: KType, explode: Boolean): MatrixBuilder {
37+
return MatrixBuilder(type, explode)
38+
}
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.papsign.ktor.openapigen.parameters.parsers.builders.path.label
2+
3+
import com.papsign.ktor.openapigen.parameters.PathParamStyle
4+
import com.papsign.ktor.openapigen.parameters.parsers.builders.Builder
5+
import com.papsign.ktor.openapigen.parameters.parsers.builders.BuilderSelectorFactory
6+
7+
object MatrixBuilderFactory: BuilderSelectorFactory<Builder<PathParamStyle>, PathParamStyle>(
8+
MatrixBuilder
9+
)

0 commit comments

Comments
 (0)