Skip to content

Commit cf6942e

Browse files
authored
Merge pull request #64 from nidomiro/feature/optimize_dsl_code
Feature/optimize dsl code
2 parents 4c32e24 + 1c86a4f commit cf6942e

26 files changed

+229
-247
lines changed

.idea/runConfigurations/Run_Tests.xml

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.apurebase.kgraphql
22

3+
import com.apurebase.kgraphql.schema.Schema
34
import com.apurebase.kgraphql.schema.dsl.SchemaBuilder
45

56

67
class KGraphQL {
78
companion object {
8-
fun schema(init : SchemaBuilder<Unit>.() -> Unit) = SchemaBuilder(init).build()
9+
fun schema(init: SchemaBuilder.() -> Unit): Schema {
10+
return SchemaBuilder()
11+
.apply(init)
12+
.build()
13+
}
914
}
1015
}

kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/dsl/EnumValueDSL.kt

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

kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/dsl/InputTypeDSL.kt

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

kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/dsl/ResolverDSL.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.apurebase.kgraphql.schema.dsl
22

3+
import com.apurebase.kgraphql.schema.dsl.types.InputValuesDSL
34
import com.apurebase.kgraphql.schema.model.InputValueDef
45

56

67
class ResolverDSL(private val target: Target) {
78
fun withArgs(block : InputValuesDSL.() -> Unit){
8-
val inputValuesDSL = InputValuesDSL(block)
9+
val inputValuesDSL = InputValuesDSL().apply(block)
910

1011
target.addInputValues(inputValuesDSL.inputValues.map { inputValue ->
1112
(inputValue.toKQLInputValue())

kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/dsl/SchemaBuilder.kt

Lines changed: 54 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
package com.apurebase.kgraphql.schema.dsl
22

3-
import com.apurebase.kgraphql.schema.*
3+
import com.apurebase.kgraphql.schema.Publisher
4+
import com.apurebase.kgraphql.schema.Schema
5+
import com.apurebase.kgraphql.schema.SchemaException
6+
import com.apurebase.kgraphql.schema.dsl.operations.MutationDSL
7+
import com.apurebase.kgraphql.schema.dsl.operations.QueryDSL
8+
import com.apurebase.kgraphql.schema.dsl.operations.SubscriptionDSL
9+
import com.apurebase.kgraphql.schema.dsl.types.*
10+
import com.apurebase.kgraphql.schema.model.EnumValueDef
11+
import com.apurebase.kgraphql.schema.model.MutableSchemaDefinition
12+
import com.apurebase.kgraphql.schema.model.TypeDef
13+
import com.apurebase.kgraphql.schema.structure.SchemaCompilation
414
import com.fasterxml.jackson.core.JsonParser
515
import com.fasterxml.jackson.databind.DeserializationContext
616
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
717
import com.fasterxml.jackson.databind.module.SimpleModule
8-
import com.apurebase.kgraphql.schema.model.EnumValueDef
9-
import com.apurebase.kgraphql.schema.model.TypeDef
10-
import com.apurebase.kgraphql.schema.model.MutableSchemaDefinition
11-
import com.apurebase.kgraphql.schema.structure.SchemaCompilation
1218
import kotlin.reflect.KClass
1319

1420
/**
1521
* SchemaBuilder exposes rich DSL to setup GraphQL schema
1622
*/
17-
class SchemaBuilder<Context : Any>(private val init: SchemaBuilder<Context>.() -> Unit) {
23+
class SchemaBuilder internal constructor() {
1824

1925
private val model = MutableSchemaDefinition()
2026

2127
private var configuration = SchemaConfigurationDSL()
2228

2329
fun build(): Schema {
24-
init()
2530
return SchemaCompilation(configuration.build(), model.toSchemaDefinition()).perform()
2631
}
2732

@@ -33,75 +38,79 @@ class SchemaBuilder<Context : Any>(private val init: SchemaBuilder<Context>.() -
3338
// OPERATIONS
3439
//================================================================================
3540

36-
fun query(name : String, init: QueryOrMutationDSL.() -> Unit): Publisher {
37-
val query = QueryOrMutationDSL(name, init).toKQLQuery()
41+
fun query(name: String, init: QueryDSL.() -> Unit): Publisher {
42+
val query = QueryDSL(name)
43+
.apply(init)
44+
.toKQLQuery()
3845
model.addQuery(query)
3946
return query
4047
}
4148

42-
fun mutation(name : String, init: QueryOrMutationDSL.() -> Unit): Publisher {
43-
val mutation = QueryOrMutationDSL(name, init).toKQLMutation()
49+
fun mutation(name: String, init: MutationDSL.() -> Unit): Publisher {
50+
val mutation = MutationDSL(name)
51+
.apply(init)
52+
.toKQLMutation()
53+
4454
model.addMutation(mutation)
4555
return mutation
4656
}
4757

4858
fun subscription(name : String, init: SubscriptionDSL.() -> Unit){
49-
model.addSubscription(SubscriptionDSL(name, init).toKQLSubscription())
59+
val subscription = SubscriptionDSL(name)
60+
.apply(init)
61+
.toKQLSubscription()
62+
63+
model.addSubscription(subscription)
5064
}
5165

5266
//================================================================================
5367
// SCALAR
5468
//================================================================================
5569

56-
fun <T : Any>stringScalar(kClass: KClass<T>, block: ScalarDSL<T, String>.() -> Unit){
57-
val scalar = StringScalarDSL(kClass, block)
58-
val coercion = scalar.createCoercion()
70+
fun <T : Any> stringScalar(kClass: KClass<T>, block: ScalarDSL<T, String>.() -> Unit) {
71+
val scalar = StringScalarDSL(kClass).apply(block)
5972
configuration.appendMapper(scalar, kClass)
60-
model.addScalar(TypeDef.Scalar(scalar.name, kClass, coercion, scalar.description))
73+
model.addScalar(TypeDef.Scalar(scalar.name, kClass, scalar.createCoercion(), scalar.description))
6174
}
6275

6376
inline fun <reified T : Any> stringScalar(noinline block: ScalarDSL<T, String>.() -> Unit) {
6477
stringScalar(T::class, block)
6578
}
6679

67-
fun <T : Any>intScalar(kClass: KClass<T>, block: ScalarDSL<T, Int>.() -> Unit){
68-
val scalar = IntScalarDSL(kClass, block)
69-
val coercion = scalar.createCoercion()
80+
fun <T : Any> intScalar(kClass: KClass<T>, block: ScalarDSL<T, Int>.() -> Unit) {
81+
val scalar = IntScalarDSL(kClass).apply(block)
7082
configuration.appendMapper(scalar, kClass)
71-
model.addScalar(TypeDef.Scalar(scalar.name, kClass, coercion, scalar.description))
83+
model.addScalar(TypeDef.Scalar(scalar.name, kClass, scalar.createCoercion(), scalar.description))
7284
}
7385

7486
inline fun <reified T : Any> intScalar(noinline block: ScalarDSL<T, Int>.() -> Unit) {
7587
intScalar(T::class, block)
7688
}
7789

78-
fun <T : Any>floatScalar(kClass: KClass<T>, block: ScalarDSL<T, Double>.() -> Unit){
79-
val scalar = DoubleScalarDSL(kClass, block)
80-
val coercion = scalar.createCoercion()
90+
fun <T : Any> floatScalar(kClass: KClass<T>, block: ScalarDSL<T, Double>.() -> Unit) {
91+
val scalar = DoubleScalarDSL(kClass).apply(block)
8192
configuration.appendMapper(scalar, kClass)
82-
model.addScalar(TypeDef.Scalar(scalar.name, kClass, coercion, scalar.description))
93+
model.addScalar(TypeDef.Scalar(scalar.name, kClass, scalar.createCoercion(), scalar.description))
8394
}
8495

8596
inline fun <reified T : Any> floatScalar(noinline block: ScalarDSL<T, Double>.() -> Unit) {
8697
floatScalar(T::class, block)
8798
}
8899

89-
fun <T : Any>longScalar(kClass: KClass<T>, block: ScalarDSL<T, Long>.() -> Unit){
90-
val scalar = LongScalarDSL(kClass, block)
91-
val coercion = scalar.createCoercion()
100+
fun <T : Any> longScalar(kClass: KClass<T>, block: ScalarDSL<T, Long>.() -> Unit) {
101+
val scalar = LongScalarDSL(kClass).apply(block)
92102
configuration.appendMapper(scalar, kClass)
93-
model.addScalar(TypeDef.Scalar(scalar.name, kClass, coercion, scalar.description))
103+
model.addScalar(TypeDef.Scalar(scalar.name, kClass, scalar.createCoercion(), scalar.description))
94104
}
95105

96-
inline fun <reified T : Any>longScalar(noinline block: ScalarDSL<T, Long>.() -> Unit) {
106+
inline fun <reified T : Any> longScalar(noinline block: ScalarDSL<T, Long>.() -> Unit) {
97107
longScalar(T::class, block)
98108
}
99109

100-
fun <T : Any>booleanScalar(kClass: KClass<T>, block: ScalarDSL<T, Boolean>.() -> Unit){
101-
val scalar = BooleanScalarDSL(kClass, block)
102-
val coercion = scalar.createCoercion()
110+
fun <T : Any> booleanScalar(kClass: KClass<T>, block: ScalarDSL<T, Boolean>.() -> Unit) {
111+
val scalar = BooleanScalarDSL(kClass).apply(block)
103112
configuration.appendMapper(scalar, kClass)
104-
model.addScalar(TypeDef.Scalar(scalar.name, kClass, coercion, scalar.description))
113+
model.addScalar(TypeDef.Scalar(scalar.name, kClass, scalar.createCoercion(), scalar.description))
105114
}
106115

107116
inline fun <reified T : Any> booleanScalar(noinline block: ScalarDSL<T, Boolean>.() -> Unit) {
@@ -112,8 +121,8 @@ class SchemaBuilder<Context : Any>(private val init: SchemaBuilder<Context>.() -
112121
// TYPE
113122
//================================================================================
114123

115-
fun <T : Any>type(kClass: KClass<T>, block: TypeDSL<T>.() -> Unit){
116-
val type = TypeDSL(model.unionsMonitor, kClass, block)
124+
fun <T : Any> type(kClass: KClass<T>, block: TypeDSL<T>.() -> Unit) {
125+
val type = TypeDSL(model.unionsMonitor, kClass).apply(block)
117126
model.addObject(type.toKQLObject())
118127
}
119128

@@ -129,8 +138,12 @@ class SchemaBuilder<Context : Any>(private val init: SchemaBuilder<Context>.() -
129138
// ENUM
130139
//================================================================================
131140

132-
fun <T : Enum<T>>enum(kClass: KClass<T>, enumValues : Array<T>, block: (EnumDSL<T>.() -> Unit)? = null){
133-
val type = EnumDSL(kClass, block)
141+
fun <T : Enum<T>> enum(kClass: KClass<T>, enumValues: Array<T>, block: (EnumDSL<T>.() -> Unit)? = null) {
142+
val type = EnumDSL(kClass).apply {
143+
if (block != null) {
144+
block()
145+
}
146+
}
134147

135148
val kqlEnumValues = enumValues.map { value ->
136149
type.valueDefinitions[value]?.let { valueDSL ->
@@ -159,8 +172,8 @@ class SchemaBuilder<Context : Any>(private val init: SchemaBuilder<Context>.() -
159172
// UNION
160173
//================================================================================
161174

162-
fun unionType(name : String, block : UnionTypeDSL.() -> Unit) : TypeID {
163-
val union = UnionTypeDSL(block)
175+
fun unionType(name: String, block: UnionTypeDSL.() -> Unit): TypeID {
176+
val union = UnionTypeDSL().apply(block)
164177
model.addUnion(TypeDef.Union(name, union.possibleTypes, union.description))
165178
return TypeID(name)
166179
}
@@ -169,8 +182,8 @@ class SchemaBuilder<Context : Any>(private val init: SchemaBuilder<Context>.() -
169182
// INPUT
170183
//================================================================================
171184

172-
fun <T : Any>inputType(kClass: KClass<T>, block : InputTypeDSL<T>.() -> Unit) {
173-
val input = InputTypeDSL(kClass, block)
185+
fun <T : Any> inputType(kClass: KClass<T>, block: InputTypeDSL<T>.() -> Unit) {
186+
val input = InputTypeDSL(kClass).apply(block)
174187
model.addInputObject(TypeDef.Input(input.name, kClass, input.description))
175188
}
176189

kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/dsl/QueryOrMutationDSL.kt renamed to kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/dsl/operations/AbstractOperationDSL.kt

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
package com.apurebase.kgraphql.schema.dsl
1+
package com.apurebase.kgraphql.schema.dsl.operations
22

33
import com.apurebase.kgraphql.Context
4+
import com.apurebase.kgraphql.schema.dsl.LimitedAccessItemDSL
5+
import com.apurebase.kgraphql.schema.dsl.ResolverDSL
46
import com.apurebase.kgraphql.schema.model.FunctionWrapper
57
import com.apurebase.kgraphql.schema.model.InputValueDef
6-
import com.apurebase.kgraphql.schema.model.MutationDef
7-
import com.apurebase.kgraphql.schema.model.QueryDef
88
import kotlin.reflect.KFunction
99

1010

11-
class QueryOrMutationDSL(
12-
val name : String,
13-
private val block : QueryOrMutationDSL.() -> Unit
14-
) : LimitedAccessItemDSL<Nothing>(), ResolverDSL.Target {
11+
abstract class AbstractOperationDSL(
12+
val name: String
13+
) : LimitedAccessItemDSL<Nothing>(),
14+
ResolverDSL.Target {
1515

16-
private val inputValues = mutableListOf<InputValueDef<*>>()
16+
protected val inputValues = mutableListOf<InputValueDef<*>>()
1717

18-
private var functionWrapper : FunctionWrapper<*>? = null
18+
internal var functionWrapper: FunctionWrapper<*>? = null
1919

2020
private fun resolver(function: FunctionWrapper<*>): ResolverDSL {
2121
functionWrapper = function
@@ -53,33 +53,5 @@ class QueryOrMutationDSL(
5353
this.inputValues.addAll(inputValues)
5454
}
5555

56-
internal fun toKQLQuery(): QueryDef<out Any?> {
57-
block()
58-
val function = functionWrapper ?: throw IllegalArgumentException("resolver has to be specified for query [$name]")
59-
60-
return QueryDef (
61-
name = name,
62-
resolver = function,
63-
description = description,
64-
isDeprecated = isDeprecated,
65-
deprecationReason = deprecationReason,
66-
inputValues = inputValues,
67-
accessRule = accessRuleBlock
68-
)
69-
}
7056

71-
internal fun toKQLMutation(): MutationDef<out Any?> {
72-
block()
73-
val function = functionWrapper ?: throw IllegalArgumentException("resolver has to be specified for mutation [$name]")
74-
75-
return MutationDef(
76-
name = name,
77-
resolver = function,
78-
description = description,
79-
isDeprecated = isDeprecated,
80-
deprecationReason = deprecationReason,
81-
inputValues = inputValues,
82-
accessRule = accessRuleBlock
83-
)
84-
}
8557
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.apurebase.kgraphql.schema.dsl.operations
2+
3+
import com.apurebase.kgraphql.schema.model.MutationDef
4+
5+
class MutationDSL(
6+
name: String
7+
) : AbstractOperationDSL(name) {
8+
9+
10+
internal fun toKQLMutation(): MutationDef<out Any?> {
11+
val function =
12+
functionWrapper ?: throw IllegalArgumentException("resolver has to be specified for mutation [$name]")
13+
14+
return MutationDef(
15+
name = name,
16+
resolver = function,
17+
description = description,
18+
isDeprecated = isDeprecated,
19+
deprecationReason = deprecationReason,
20+
inputValues = inputValues,
21+
accessRule = accessRuleBlock
22+
)
23+
}
24+
25+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.apurebase.kgraphql.schema.dsl.operations
2+
3+
import com.apurebase.kgraphql.schema.model.QueryDef
4+
5+
class QueryDSL(
6+
name: String
7+
) : AbstractOperationDSL(name) {
8+
9+
10+
internal fun toKQLQuery(): QueryDef<out Any?> {
11+
val function =
12+
functionWrapper ?: throw IllegalArgumentException("resolver has to be specified for query [$name]")
13+
14+
return QueryDef(
15+
name = name,
16+
resolver = function,
17+
description = description,
18+
isDeprecated = isDeprecated,
19+
deprecationReason = deprecationReason,
20+
inputValues = inputValues,
21+
accessRule = accessRuleBlock
22+
)
23+
}
24+
}

0 commit comments

Comments
 (0)