diff --git a/examples/gradle-ktor/build.gradle.kts b/examples/gradle-ktor/build.gradle.kts index 9ffa5df44..587e1cc04 100644 --- a/examples/gradle-ktor/build.gradle.kts +++ b/examples/gradle-ktor/build.gradle.kts @@ -3,6 +3,7 @@ import community.flock.wirespec.compiler.core.emit.shared.KotlinShared import community.flock.wirespec.compiler.core.parse.AST import community.flock.wirespec.compiler.core.parse.Refined import community.flock.wirespec.compiler.core.parse.Type +import community.flock.wirespec.compiler.utils.noLogger import community.flock.wirespec.plugin.FileExtension import community.flock.wirespec.plugin.Language import community.flock.wirespec.plugin.gradle.CompileWirespecTask @@ -80,7 +81,7 @@ tasks.register("wirespec-typescript") { languages = listOf(Language.TypeScript) } -class KotlinSerializableEmitter : KotlinEmitter("community.flock.wirespec.generated.kotlin") { +class KotlinSerializableEmitter : KotlinEmitter("community.flock.wirespec.generated.kotlin", noLogger) { override fun emit(type: Type, ast: AST): String = """ |@kotlinx.serialization.Serializable diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/Compiler.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/Compiler.kt index b2cfa0186..1e1f7f54d 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/Compiler.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/Compiler.kt @@ -3,42 +3,40 @@ package community.flock.wirespec.compiler.core import arrow.core.Either import arrow.core.Nel import arrow.core.NonEmptyList -import community.flock.wirespec.compiler.core.Reported.EMITTED -import community.flock.wirespec.compiler.core.Reported.PARSED -import community.flock.wirespec.compiler.core.Reported.TOKENIZED -import community.flock.wirespec.compiler.core.Reported.VALIDATED +import community.flock.wirespec.compiler.core.Stage.EMITTED +import community.flock.wirespec.compiler.core.Stage.PARSED +import community.flock.wirespec.compiler.core.Stage.TOKENIZED +import community.flock.wirespec.compiler.core.Stage.VALIDATED import community.flock.wirespec.compiler.core.emit.common.Emitted -import community.flock.wirespec.compiler.core.emit.common.Emitter +import community.flock.wirespec.compiler.core.emit.common.HasEmitter import community.flock.wirespec.compiler.core.exceptions.WirespecException import community.flock.wirespec.compiler.core.parse.AST import community.flock.wirespec.compiler.core.parse.Parser import community.flock.wirespec.compiler.core.tokenize.tokenize import community.flock.wirespec.compiler.core.validate.validate -import community.flock.wirespec.compiler.utils.Logger +import community.flock.wirespec.compiler.utils.HasLogger -fun LanguageSpec.parse(source: String): (Logger) -> Either, AST> = - { logger -> - tokenize(source) - .also((TOKENIZED::report)(logger)) - .let(Parser(logger)::parse) - .also((PARSED::report)(logger)) - .map { it.validate() } - .also((VALIDATED::report)(logger)) - } +interface CompilationContext : ParseContext, HasEmitter -fun LanguageSpec.compile(source: String): (Logger) -> (Emitter) -> Either, List> = - { logger -> - { emitter -> - parse(source)(logger) - .map(emitter::emit) - .also((EMITTED::report)(logger)) - } - } +fun CompilationContext.compile(source: String): Either, List> = + parse(source) + .map(emitter::emit) + .also(EMITTED::log) + +interface ParseContext : HasLanguageSpec, HasLogger + +fun ParseContext.parse(source: String): Either, AST> = + spec.tokenize(source) + .also(TOKENIZED::log) + .let(Parser(logger)::parse) + .also(PARSED::log) + .map { it.validate() } + .also(VALIDATED::log) -private enum class Reported { +private enum class Stage { TOKENIZED, PARSED, VALIDATED, EMITTED; - fun report(logger: Logger): (Any) -> Unit = { + fun log(it: Any): HasLogger.() -> Unit = { logger.info("********** $name **********\n$it\n########## $name ##########") } } diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/LanguageSpec.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/LanguageSpec.kt index fbc10a4c0..c40751517 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/LanguageSpec.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/LanguageSpec.kt @@ -41,6 +41,10 @@ interface LanguageSpec { val orderedMatchers: List } +interface HasLanguageSpec { + val spec: LanguageSpec get() = WirespecSpec +} + object WirespecSpec : LanguageSpec { override val customType = WsCustomType override val orderedMatchers = listOf( diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitter.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitter.kt index ba1fbf4a6..efa21cbf1 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitter.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitter.kt @@ -23,11 +23,10 @@ import community.flock.wirespec.compiler.core.parse.Refined import community.flock.wirespec.compiler.core.parse.Type import community.flock.wirespec.compiler.core.parse.Union import community.flock.wirespec.compiler.utils.Logger -import community.flock.wirespec.compiler.utils.noLogger open class JavaEmitter( private val packageName: String = DEFAULT_GENERATED_PACKAGE_STRING, - logger: Logger = noLogger, + logger: Logger, ) : DefinitionModelEmitter, Emitter(logger, true) { val import = """ @@ -275,12 +274,7 @@ open class JavaEmitter( """.trimMargin() fun Endpoint.Response.emit() = """ - |${Spacer}record Response${status.firstToUpper()}(${ - listOfNotNull( - headers.joinToString { it.emit() }.orNull(), - content?.let { "${it.emit()} body" } - ).joinToString() - }) implements Response${status.first()}XX<${content.emit()}>, Response${content.emit().concatGenerics()} { + |${Spacer}record Response${status.firstToUpper()}(${listOfNotNull(headers.joinToString { it.emit() }.orNull(), content?.let { "${it.emit()} body" }).joinToString()}) implements Response${status.first()}XX<${content.emit()}>, Response${content.emit().concatGenerics()} { |${Spacer(2)}@Override public int getStatus() { return ${status.fixStatus()}; } |${Spacer(2)}${headers.joinToString { emit(it.identifier) }.let { "@Override public Headers getHeaders() { return new Headers($it); }" }} |${Spacer(2)}@Override public ${content.emit()} getBody() { return ${if(content == null) "null" else "body"}; } @@ -354,7 +348,7 @@ open class JavaEmitter( else -> this } - fun String.sanitizeSymbol() = this + private fun String.sanitizeSymbol() = this .split(".", " ", "-") .mapIndexed { index, s -> if(index > 0) s.firstToUpper() else s } .joinToString("") diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitter.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitter.kt index ff01d98aa..38b8dd8c3 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitter.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitter.kt @@ -24,11 +24,10 @@ import community.flock.wirespec.compiler.core.parse.Refined import community.flock.wirespec.compiler.core.parse.Type import community.flock.wirespec.compiler.core.parse.Union import community.flock.wirespec.compiler.utils.Logger -import community.flock.wirespec.compiler.utils.noLogger open class KotlinEmitter( private val packageName: String = DEFAULT_GENERATED_PACKAGE_STRING, - logger: Logger = noLogger, + logger: Logger, ) : DefinitionModelEmitter, Emitter(logger, false) { val import = """ @@ -322,5 +321,4 @@ open class KotlinEmitter( "typeof", "val", "var", "when", "while", "private", "public" ) } - } diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/ScalaEmitter.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/ScalaEmitter.kt index db3b4d18a..4aae94879 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/ScalaEmitter.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/ScalaEmitter.kt @@ -20,11 +20,10 @@ import community.flock.wirespec.compiler.core.parse.Refined import community.flock.wirespec.compiler.core.parse.Type import community.flock.wirespec.compiler.core.parse.Union import community.flock.wirespec.compiler.utils.Logger -import community.flock.wirespec.compiler.utils.noLogger open class ScalaEmitter( private val packageName: String = DEFAULT_GENERATED_PACKAGE_STRING, - logger: Logger = noLogger + logger: Logger, ) : DefinitionModelEmitter, Emitter(logger) { val import = """ @@ -79,14 +78,16 @@ open class ScalaEmitter( is Reference.Custom -> value is Reference.Primitive -> when (type) { is Reference.Primitive.Type.String -> "String" - is Reference.Primitive.Type.Integer -> when(type.precision){ + is Reference.Primitive.Type.Integer -> when (type.precision) { Reference.Primitive.Type.Precision.P32 -> "Int" Reference.Primitive.Type.Precision.P64 -> "Long" } - is Reference.Primitive.Type.Number -> when(type.precision){ + + is Reference.Primitive.Type.Number -> when (type.precision) { Reference.Primitive.Type.Precision.P32 -> "Float" Reference.Primitive.Type.Precision.P64 -> "Double" } + is Reference.Primitive.Type.Boolean -> "Boolean" is Reference.Primitive.Type.Bytes -> "Array[Byte]" } diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/TypeScriptEmitter.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/TypeScriptEmitter.kt index b3b33e7b2..66b86fc56 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/TypeScriptEmitter.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/TypeScriptEmitter.kt @@ -17,9 +17,8 @@ import community.flock.wirespec.compiler.core.parse.Refined import community.flock.wirespec.compiler.core.parse.Type import community.flock.wirespec.compiler.core.parse.Union import community.flock.wirespec.compiler.utils.Logger -import community.flock.wirespec.compiler.utils.noLogger -open class TypeScriptEmitter(logger: Logger = noLogger) : DefinitionModelEmitter, Emitter(logger) { +open class TypeScriptEmitter(logger: Logger) : DefinitionModelEmitter, Emitter(logger) { override fun Definition.emitName(): String = when (this) { is Endpoint -> emit(identifier) @@ -149,7 +148,9 @@ open class TypeScriptEmitter(logger: Logger = noLogger) : DefinitionModelEmitter """.trimIndent() private fun Endpoint.Request.emitFunction(endpoint: Endpoint) = """ - |${Spacer}export const request = (${paramList(endpoint).takeIf { it.isNotEmpty() }?.let { "props: ${it.joinToObject { it.emit() }}" }.orEmpty()}): Request => ({ + |${Spacer}export const request = (${ + paramList(endpoint).takeIf { it.isNotEmpty() }?.let { "props: ${it.joinToObject { it.emit() }}" }.orEmpty() + }): Request => ({ |${Spacer(2)}path: ${endpoint.pathParams.joinToObject { "${emit(it.identifier)}: props.${emit(it.identifier)}" }}, |${Spacer(2)}method: "${endpoint.method}", |${Spacer(2)}queries: ${endpoint.queries.joinToObject { "${emit(it.identifier)}: props.${emit(it.identifier)}" }}, @@ -159,7 +160,9 @@ open class TypeScriptEmitter(logger: Logger = noLogger) : DefinitionModelEmitter """.trimIndent() private fun Endpoint.Response.emitFunction(endpoint: Endpoint) = """ - |${Spacer}export const response${status.firstToUpper()} = (${paramList().takeIf { it.isNotEmpty() }?.let { "props: ${it.joinToObject { it.emit() }}" }.orEmpty()}): Response${status.firstToUpper()} => ({ + |${Spacer}export const response${status.firstToUpper()} = (${ + paramList().takeIf { it.isNotEmpty() }?.let { "props: ${it.joinToObject { it.emit() }}" }.orEmpty() + }): Response${status.firstToUpper()} => ({ |${Spacer(2)}status: ${status}, |${Spacer(2)}headers: ${endpoint.headers.joinToObject { "${emit(it.identifier)}: props.${emit(it.identifier)}" }}, |${Spacer(2)}body: ${content?.let { "props.body" } ?: "undefined"}, diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/WirespecEmitter.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/WirespecEmitter.kt index 3895417a1..31ad9bf46 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/WirespecEmitter.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/WirespecEmitter.kt @@ -19,9 +19,8 @@ import community.flock.wirespec.compiler.core.parse.Refined import community.flock.wirespec.compiler.core.parse.Type import community.flock.wirespec.compiler.core.parse.Union import community.flock.wirespec.compiler.utils.Logger -import community.flock.wirespec.compiler.utils.noLogger -open class WirespecEmitter(logger: Logger = noLogger) : DefinitionModelEmitter, Emitter(logger) { +open class WirespecEmitter(logger: Logger) : DefinitionModelEmitter, Emitter(logger) { override fun Definition.emitName(): String = when (this) { is Endpoint -> emit(identifier) @@ -46,9 +45,11 @@ open class WirespecEmitter(logger: Logger = noLogger) : DefinitionModelEmitter, override fun Field.emit() = "${emit(identifier)}: ${reference.emit()}${if (isNullable) "?" else ""}" - override fun emit(identifier: Identifier) = when(identifier){ - is DefinitionIdentifier -> identifier.run { if (value in reservedKeywords) value.addBackticks() else value } - is FieldIdentifier -> identifier.run { if (value in reservedKeywords || value.first().isUpperCase()) value.addBackticks() else value } + override fun emit(identifier: Identifier) = when (identifier) { + is DefinitionIdentifier -> identifier.run { if (value in reservedKeywords) value.addBackticks() else value } + is FieldIdentifier -> identifier.run { + if (value in reservedKeywords || value.first().isUpperCase()) value.addBackticks() else value + } } override fun emit(channel: Channel): String = @@ -62,11 +63,12 @@ open class WirespecEmitter(logger: Logger = noLogger) : DefinitionModelEmitter, is Reference.Primitive.Type.String -> "String" is Reference.Primitive.Type.Boolean -> "Boolean" is Reference.Primitive.Type.Bytes -> "Bytes" - is Reference.Primitive.Type.Integer -> when(type.precision){ + is Reference.Primitive.Type.Integer -> when (type.precision) { Reference.Primitive.Type.Precision.P32 -> "Integer32" Reference.Primitive.Type.Precision.P64 -> "Integer" } - is Reference.Primitive.Type.Number -> when(type.precision){ + + is Reference.Primitive.Type.Number -> when (type.precision) { Reference.Primitive.Type.Precision.P32 -> "Number32" Reference.Primitive.Type.Precision.P64 -> "Number" } diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/common/Emitter.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/common/Emitter.kt index 887b53feb..a5f817025 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/common/Emitter.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/core/emit/common/Emitter.kt @@ -125,3 +125,7 @@ abstract class Emitter( ) } } + +interface HasEmitter { + val emitter: Emitter +} diff --git a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/utils/Logger.kt b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/utils/Logger.kt index 40878fae9..7ae73b279 100644 --- a/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/utils/Logger.kt +++ b/src/compiler/core/src/commonMain/kotlin/community/flock/wirespec/compiler/utils/Logger.kt @@ -43,4 +43,8 @@ open class Logger(logLevel: Level?) { } } +interface HasLogger { + val logger: Logger +} + val noLogger = object : Logger(logLevel = null) {} diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileChannelTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileChannelTest.kt index f218a1232..04396390a 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileChannelTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileChannelTest.kt @@ -25,7 +25,7 @@ class CompileChannelTest { | """.trimMargin() - compiler(KotlinEmitter()) shouldBeRight kotlin + compiler { KotlinEmitter(logger = it) } shouldBeRight kotlin } @Test @@ -39,7 +39,7 @@ class CompileChannelTest { | """.trimMargin() - compiler(JavaEmitter()) shouldBeRight java + compiler { JavaEmitter(logger = it) } shouldBeRight java } @Test @@ -51,7 +51,7 @@ class CompileChannelTest { | """.trimMargin() - compiler(ScalaEmitter()) shouldBeRight scala + compiler { ScalaEmitter(logger = it) } shouldBeRight scala } @Test @@ -61,7 +61,7 @@ class CompileChannelTest { | """.trimMargin() - compiler(TypeScriptEmitter()) shouldBeRight ts + compiler { TypeScriptEmitter(logger = it) } shouldBeRight ts } @Test @@ -70,6 +70,6 @@ class CompileChannelTest { |channel Queue -> String """.trimMargin() - compiler(WirespecEmitter()) shouldBeRight wirespec + compiler { WirespecEmitter(logger = it) } shouldBeRight wirespec } } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileEnumTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileEnumTest.kt index 2683d5e7f..3c2b98ba8 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileEnumTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileEnumTest.kt @@ -36,7 +36,7 @@ class CompileEnumTest { | """.trimMargin() - compiler(KotlinEmitter()) shouldBeRight kotlin + compiler { KotlinEmitter(logger = it) } shouldBeRight kotlin } @Test @@ -67,7 +67,7 @@ class CompileEnumTest { | """.trimMargin() - compiler(JavaEmitter()) shouldBeRight java + compiler { JavaEmitter(logger = it) } shouldBeRight java } @Test @@ -87,7 +87,7 @@ class CompileEnumTest { | """.trimMargin() - compiler(ScalaEmitter()) shouldBeRight scala + compiler { ScalaEmitter(logger = it) } shouldBeRight scala } @Test @@ -97,7 +97,7 @@ class CompileEnumTest { | """.trimMargin() - compiler(TypeScriptEmitter()) shouldBeRight ts + compiler { TypeScriptEmitter(logger = it) } shouldBeRight ts } @Test @@ -109,6 +109,6 @@ class CompileEnumTest { | """.trimMargin() - compiler(WirespecEmitter()) shouldBeRight wirespec + compiler { WirespecEmitter(logger = it) } shouldBeRight wirespec } } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileFullEndpointTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileFullEndpointTest.kt index ed217564d..37630cc47 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileFullEndpointTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileFullEndpointTest.kt @@ -169,7 +169,7 @@ class CompileFullEndpointTest { | """.trimMargin() - compiler(KotlinEmitter()) shouldBeRight kotlin + compiler { KotlinEmitter(logger = it) } shouldBeRight kotlin } @Test @@ -292,7 +292,7 @@ class CompileFullEndpointTest { | """.trimMargin() - compiler(JavaEmitter()) shouldBeRight java + compiler { JavaEmitter(logger = it) } shouldBeRight java } @Test @@ -326,7 +326,7 @@ class CompileFullEndpointTest { | """.trimMargin() - compiler(ScalaEmitter()) shouldBeRight scala + compiler { ScalaEmitter(logger = it) } shouldBeRight scala } @Test @@ -476,7 +476,7 @@ class CompileFullEndpointTest { | """.trimMargin() - compiler(TypeScriptEmitter()) shouldBeRight ts + compiler { TypeScriptEmitter(logger = it) } shouldBeRight ts } @Test @@ -509,6 +509,6 @@ class CompileFullEndpointTest { | """.trimMargin() - compiler(WirespecEmitter()) shouldBeRight wirespec + compiler { WirespecEmitter(logger = it) } shouldBeRight wirespec } } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileMinimalEndpointTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileMinimalEndpointTest.kt index 181645881..262337150 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileMinimalEndpointTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileMinimalEndpointTest.kt @@ -106,7 +106,7 @@ class CompileMinimalEndpointTest { | """.trimMargin() - compiler(KotlinEmitter()) shouldBeRight kotlin + compiler { KotlinEmitter(logger = it) } shouldBeRight kotlin } @Test @@ -206,7 +206,7 @@ class CompileMinimalEndpointTest { | """.trimMargin() - compiler(JavaEmitter()) shouldBeRight java + compiler { JavaEmitter(logger = it) } shouldBeRight java } @Test @@ -224,7 +224,7 @@ class CompileMinimalEndpointTest { | """.trimMargin() - compiler(ScalaEmitter()) shouldBeRight scala + compiler { ScalaEmitter(logger = it) } shouldBeRight scala } @Test @@ -333,7 +333,7 @@ class CompileMinimalEndpointTest { | """.trimMargin() - compiler(TypeScriptEmitter()) shouldBeRight ts + compiler { TypeScriptEmitter(logger = it) } shouldBeRight ts } @Test @@ -349,6 +349,6 @@ class CompileMinimalEndpointTest { | """.trimMargin() - compiler(WirespecEmitter()) shouldBeRight wirespec + compiler { WirespecEmitter(logger = it) } shouldBeRight wirespec } } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileRefinedTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileRefinedTest.kt index d61972f95..46e899c79 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileRefinedTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileRefinedTest.kt @@ -30,7 +30,7 @@ class CompileRefinedTest { | """.trimMargin() - compiler(KotlinEmitter()) shouldBeRight kotlin + compiler { KotlinEmitter(logger = it) } shouldBeRight kotlin } @Test @@ -52,7 +52,7 @@ class CompileRefinedTest { | """.trimMargin() - compiler(JavaEmitter()) shouldBeRight java + compiler { JavaEmitter(logger = it) } shouldBeRight java } @Test @@ -71,7 +71,7 @@ class CompileRefinedTest { | """.trimMargin() - compiler(ScalaEmitter()) shouldBeRight scala + compiler { ScalaEmitter(logger = it) } shouldBeRight scala } @Test @@ -84,7 +84,7 @@ class CompileRefinedTest { | """.trimMargin() - compiler(TypeScriptEmitter()) shouldBeRight ts + compiler { TypeScriptEmitter(logger = it) } shouldBeRight ts } @Test @@ -94,6 +94,6 @@ class CompileRefinedTest { | """.trimMargin() - compiler(WirespecEmitter()) shouldBeRight wirespec + compiler { WirespecEmitter(logger = it) } shouldBeRight wirespec } } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileTypeTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileTypeTest.kt index 01473de9a..96cfdb950 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileTypeTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileTypeTest.kt @@ -35,7 +35,7 @@ class CompileTypeTest { | """.trimMargin() - compiler(KotlinEmitter()) shouldBeRight kotlin + compiler { KotlinEmitter(logger = it) } shouldBeRight kotlin } @Test @@ -54,7 +54,7 @@ class CompileTypeTest { | """.trimMargin() - compiler(JavaEmitter()) shouldBeRight java + compiler { JavaEmitter(logger = it) } shouldBeRight java } @Test @@ -72,7 +72,7 @@ class CompileTypeTest { | """.trimMargin() - compiler(ScalaEmitter()) shouldBeRight scala + compiler { ScalaEmitter(logger = it) } shouldBeRight scala } @Test @@ -89,7 +89,7 @@ class CompileTypeTest { | """.trimMargin() - compiler(TypeScriptEmitter()) shouldBeRight ts + compiler { TypeScriptEmitter(logger = it) } shouldBeRight ts } @Test @@ -105,6 +105,6 @@ class CompileTypeTest { | """.trimMargin() - compiler(WirespecEmitter()) shouldBeRight wirespec + compiler { WirespecEmitter(logger = it) } shouldBeRight wirespec } } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileUnionTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileUnionTest.kt index 70d73eca2..fbb04a453 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileUnionTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/CompileUnionTest.kt @@ -48,7 +48,7 @@ class CompileUnionTest { | """.trimMargin() - compiler(KotlinEmitter()) shouldBeRight expected + compiler { KotlinEmitter(logger = it) } shouldBeRight expected } @Test @@ -60,7 +60,7 @@ class CompileUnionTest { | """.trimMargin() - compiler(JavaEmitter()) shouldBeRight java + compiler { JavaEmitter(logger = it) } shouldBeRight java } @Test @@ -86,7 +86,7 @@ class CompileUnionTest { | """.trimMargin() - compiler(ScalaEmitter()) shouldBeRight scala + compiler { ScalaEmitter(logger = it) } shouldBeRight scala } @Test @@ -113,7 +113,7 @@ class CompileUnionTest { | """.trimMargin() - compiler(TypeScriptEmitter()) shouldBeRight ts + compiler { TypeScriptEmitter(logger = it) } shouldBeRight ts } @Test @@ -137,6 +137,6 @@ class CompileUnionTest { | """.trimMargin() - compiler(WirespecEmitter()) shouldBeRight wirespec + compiler { WirespecEmitter(logger = it) } shouldBeRight wirespec } } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/TestUtils.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/TestUtils.kt index 154ee3ded..58186f70b 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/TestUtils.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/TestUtils.kt @@ -1,10 +1,15 @@ package community.flock.wirespec.compiler.core import community.flock.wirespec.compiler.core.emit.common.Emitter +import community.flock.wirespec.compiler.utils.Logger import community.flock.wirespec.compiler.utils.noLogger -fun compile(source: String) = { emitter: Emitter -> - WirespecSpec.compile(source)(noLogger)(emitter) +fun compile(source: String) = { emitter: (Logger) -> Emitter -> + object : CompilationContext { + override val spec = WirespecSpec + override val logger = noLogger + override val emitter = emitter(logger) + }.compile(source) .map { it.first().result } .onLeft(::println) } diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitterTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitterTest.kt index 13889b3b7..099d6760d 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitterTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/JavaEmitterTest.kt @@ -1,14 +1,19 @@ package community.flock.wirespec.compiler.core.emit +import community.flock.wirespec.compiler.core.CompilationContext import community.flock.wirespec.compiler.core.emit.common.Emitter import community.flock.wirespec.compiler.core.fixture.NodeFixtures import community.flock.wirespec.compiler.core.parse.Node +import community.flock.wirespec.compiler.utils.noLogger import io.kotest.matchers.shouldBe import kotlin.test.Test class JavaEmitterTest { - private val emitter = JavaEmitter() + private val emitter = object : CompilationContext { + override val logger = noLogger + override val emitter = JavaEmitter(logger = logger) + }.emitter @Test fun testEmitterType() { diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitterTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitterTest.kt index 4f722264d..4dd336630 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitterTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/emit/KotlinEmitterTest.kt @@ -1,14 +1,19 @@ package community.flock.wirespec.compiler.core.emit +import community.flock.wirespec.compiler.core.CompilationContext import community.flock.wirespec.compiler.core.emit.common.Emitter import community.flock.wirespec.compiler.core.fixture.NodeFixtures import community.flock.wirespec.compiler.core.parse.Node +import community.flock.wirespec.compiler.utils.noLogger import io.kotest.matchers.shouldBe import kotlin.test.Test class KotlinEmitterTest { - private val emitter = KotlinEmitter() + private val emitter = object : CompilationContext { + override val logger = noLogger + override val emitter = KotlinEmitter(logger = logger) + }.emitter @Test fun testEmitterType() { diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseChannelTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseChannelTest.kt index 3296afdb6..b9c9df909 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseChannelTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseChannelTest.kt @@ -1,5 +1,6 @@ package community.flock.wirespec.compiler.core.parse +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.utils.noLogger @@ -10,7 +11,10 @@ import kotlin.test.Test class ParseChannelTest { - private fun parser(source: String) = WirespecSpec.parse(source)(noLogger) + private fun parser(source: String) = object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(source) @Test fun testChannelParser() { diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseEndpointTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseEndpointTest.kt index 2b263867d..e09528800 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseEndpointTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseEndpointTest.kt @@ -1,5 +1,6 @@ package community.flock.wirespec.compiler.core.parse +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.core.parse.Endpoint.Method.GET @@ -16,7 +17,10 @@ import kotlin.test.Test class ParseEndpointTest { - private fun parser(source: String) = WirespecSpec.parse(source)(noLogger) + private fun parser(source: String) = object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(source) @Test fun testEndpointParser() { diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTest.kt index b4c4d05f4..63d93754d 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTest.kt @@ -1,5 +1,6 @@ package community.flock.wirespec.compiler.core.parse +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.utils.noLogger @@ -10,7 +11,10 @@ import kotlin.test.Test class ParseTest { - private fun parser(source: String) = WirespecSpec.parse(source)(noLogger) + private fun parser(source: String) = object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(source) @Test fun testParserWithCorrectInput() { diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTypeTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTypeTest.kt index f311509d0..0d68f4921 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTypeTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParseTypeTest.kt @@ -1,5 +1,6 @@ package community.flock.wirespec.compiler.core.parse +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.utils.noLogger @@ -10,7 +11,10 @@ import kotlin.test.Test class ParseTypeTest { - private fun parser(source: String) = WirespecSpec.parse(source)(noLogger) + private fun parser(source: String) = object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(source) @Test fun testTypeParser() { diff --git a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParserReferenceTest.kt b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParserReferenceTest.kt index 1b88bf435..a23f7e169 100644 --- a/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParserReferenceTest.kt +++ b/src/compiler/core/src/commonTest/kotlin/community/flock/wirespec/compiler/core/parse/ParserReferenceTest.kt @@ -1,5 +1,6 @@ package community.flock.wirespec.compiler.core.parse +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.utils.noLogger @@ -10,7 +11,10 @@ import kotlin.test.Test class ParserReferenceTest { - private fun parser(source: String) = WirespecSpec.parse(source)(noLogger) + private fun parser(source: String) = object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(source) @Test fun shouldHaveSelfRef() { diff --git a/src/compiler/lib/src/jsTest/kotlin/community/flock/wirespec/compiler/lib/TestLib.kt b/src/compiler/lib/src/jsTest/kotlin/community/flock/wirespec/compiler/lib/TestLib.kt index 170e0200a..9f09cfa6b 100644 --- a/src/compiler/lib/src/jsTest/kotlin/community/flock/wirespec/compiler/lib/TestLib.kt +++ b/src/compiler/lib/src/jsTest/kotlin/community/flock/wirespec/compiler/lib/TestLib.kt @@ -1,6 +1,7 @@ package community.flock.wirespec.compiler.lib import com.goncalossilva.resources.Resource +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.utils.noLogger @@ -10,11 +11,13 @@ import kotlin.test.assertEquals class TestLib { @Test - fun testProduceConsume(){ + fun testProduceConsume() { val source = Resource("src/jsTest/resources/person.ws").readText() println(source) - val res = WirespecSpec.parse(source)(noLogger) - res.map { ast -> + object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(source).map { ast -> val output = ast.produce() val input = output.map { it.consume() } assertEquals(input, ast) diff --git a/src/converter/openapi/src/commonMain/kotlin/community/flock/wirespec/openapi/v2/OpenApiV2Emitter.kt b/src/converter/openapi/src/commonMain/kotlin/community/flock/wirespec/openapi/v2/OpenApiV2Emitter.kt index a21adc1ab..262bf6e34 100644 --- a/src/converter/openapi/src/commonMain/kotlin/community/flock/wirespec/openapi/v2/OpenApiV2Emitter.kt +++ b/src/converter/openapi/src/commonMain/kotlin/community/flock/wirespec/openapi/v2/OpenApiV2Emitter.kt @@ -32,7 +32,7 @@ import kotlinx.serialization.encodeToString import kotlinx.serialization.json.JsonPrimitive import community.flock.kotlinx.openapi.bindings.v2.Type as OpenApiType -object OpenApiV2Emitter: Emitter(noLogger) { +object OpenApiV2Emitter : Emitter(noLogger) { override val singleLineComment = "" @@ -184,7 +184,7 @@ object OpenApiV2Emitter: Emitter(noLogger) { fun Reference.emit(): SchemaOrReferenceObject = when (this) { is Reference.Custom -> ReferenceObject(ref = Ref("#/definitions/${value}")) - is Reference.Primitive ->SchemaObject(type = type.emitType(), format = emitFormat()) + is Reference.Primitive -> SchemaObject(type = type.emitType(), format = emitFormat()) is Reference.Any -> error("Cannot map Any") is Reference.Unit -> error("Cannot map Unit") }.let { if (isIterable) SchemaObject(type = OpenApiType.ARRAY, items = it) else it } diff --git a/src/converter/openapi/src/commonTest/kotlin/community/flock/wirespec/openapi/convert/ConvertAndCompile.kt b/src/converter/openapi/src/commonTest/kotlin/community/flock/wirespec/openapi/convert/ConvertAndCompile.kt index 05129c6dd..1a9d5ec8b 100644 --- a/src/converter/openapi/src/commonTest/kotlin/community/flock/wirespec/openapi/convert/ConvertAndCompile.kt +++ b/src/converter/openapi/src/commonTest/kotlin/community/flock/wirespec/openapi/convert/ConvertAndCompile.kt @@ -1,7 +1,7 @@ package community.flock.wirespec.openapi.convert import com.goncalossilva.resources.Resource -import community.flock.wirespec.compiler.core.WirespecSpec +import community.flock.wirespec.compiler.core.CompilationContext import community.flock.wirespec.compiler.core.compile import community.flock.wirespec.compiler.core.emit.KotlinEmitter import community.flock.wirespec.compiler.core.emit.WirespecEmitter @@ -17,15 +17,20 @@ class ConvertAndCompile { fun testV2ConversionAndCompilation() { val input = Resource("src/commonTest/resources/v2/petstore.json").readText() val ast = OpenApiV2Parser.parse(input, true) - val wirespec = WirespecEmitter().emit(ast).joinToString("\n") { it.result } - WirespecSpec.compile(wirespec)(noLogger)(KotlinEmitter()).shouldBeRight() + val wirespec = WirespecEmitter(noLogger).emit(ast).joinToString("\n") { it.result } + compiler(wirespec).shouldBeRight() } @Test fun testV3ConversionAndCompilation() { val input = Resource("src/commonTest/resources/v3/petstore.json").readText() val ast = OpenApiV3Parser.parse(input, true) - val wirespec = WirespecEmitter().emit(ast).joinToString("\n") { it.result } - WirespecSpec.compile(wirespec)(noLogger)(KotlinEmitter()).shouldBeRight() + val wirespec = WirespecEmitter(noLogger).emit(ast).joinToString("\n") { it.result } + compiler(wirespec).shouldBeRight() } + + private fun compiler(source: String) = object : CompilationContext { + override val logger = noLogger + override val emitter = KotlinEmitter(logger = logger) + }.compile(source) } diff --git a/src/integration/jackson/src/jvmTest/kotlin/community/flock/wirespec/integration/jackson/kotlin/GenerateTestClasses.kt b/src/integration/jackson/src/jvmTest/kotlin/community/flock/wirespec/integration/jackson/kotlin/GenerateTestClasses.kt index ea63bd775..26719aa7b 100644 --- a/src/integration/jackson/src/jvmTest/kotlin/community/flock/wirespec/integration/jackson/kotlin/GenerateTestClasses.kt +++ b/src/integration/jackson/src/jvmTest/kotlin/community/flock/wirespec/integration/jackson/kotlin/GenerateTestClasses.kt @@ -1,5 +1,6 @@ package community.flock.wirespec.integration.jackson.kotlin +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.emit.JavaEmitter import community.flock.wirespec.compiler.core.emit.KotlinEmitter @@ -15,8 +16,8 @@ class GenerateTestClasses { private val javaPkg = "${basePkg}.java.generated" private val kotlinPkg = "${basePkg}.kotlin.generated" - private val javaEmitter = JavaEmitter(javaPkg) - private val kotlinEmitter = KotlinEmitter(kotlinPkg) + private val javaEmitter = JavaEmitter(javaPkg, noLogger) + private val kotlinEmitter = KotlinEmitter(kotlinPkg, noLogger) private fun pkgToPath(pkg: String) = pkg.split(".").joinToString("/") @@ -27,7 +28,10 @@ class GenerateTestClasses { @Test fun generate() { val todoFile = File("src/commonTest/resources/wirespec/todos.ws").readText() - val ast = WirespecSpec.parse(todoFile)(noLogger) + val ast = object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(todoFile) .fold({ error("Cannot parse wirespec: ${it.first().message}") }, { it }) .filterIsInstance() @@ -45,4 +49,3 @@ class GenerateTestClasses { } } } - diff --git a/src/integration/spring/src/jvmMain/kotlin/community/flock/wirespec/integration/spring/kotlin/emit/SpringKotlinEmitter.kt b/src/integration/spring/src/jvmMain/kotlin/community/flock/wirespec/integration/spring/kotlin/emit/SpringKotlinEmitter.kt index f9538b502..b042de141 100644 --- a/src/integration/spring/src/jvmMain/kotlin/community/flock/wirespec/integration/spring/kotlin/emit/SpringKotlinEmitter.kt +++ b/src/integration/spring/src/jvmMain/kotlin/community/flock/wirespec/integration/spring/kotlin/emit/SpringKotlinEmitter.kt @@ -3,9 +3,8 @@ package community.flock.wirespec.integration.spring.kotlin.emit import community.flock.wirespec.compiler.core.emit.KotlinEmitter import community.flock.wirespec.compiler.core.parse.Endpoint import community.flock.wirespec.compiler.utils.Logger -import community.flock.wirespec.compiler.utils.noLogger -class SpringKotlinEmitter(packageName: String, logger: Logger = noLogger) : KotlinEmitter(packageName, logger) { +class SpringKotlinEmitter(packageName: String, logger: Logger) : KotlinEmitter(packageName, logger) { override fun emitHandleFunction(endpoint: Endpoint): String { val path = "/${endpoint.path.joinToString("/") { it.emit() }}" val annotation = when (endpoint.method) { diff --git a/src/integration/spring/src/jvmTest/kotlin/community/flock/wirespec/integration/spring/kotlin/GenerateTestClasses.kt b/src/integration/spring/src/jvmTest/kotlin/community/flock/wirespec/integration/spring/kotlin/GenerateTestClasses.kt index 1e2bf3a75..fdecc3bae 100644 --- a/src/integration/spring/src/jvmTest/kotlin/community/flock/wirespec/integration/spring/kotlin/GenerateTestClasses.kt +++ b/src/integration/spring/src/jvmTest/kotlin/community/flock/wirespec/integration/spring/kotlin/GenerateTestClasses.kt @@ -1,5 +1,6 @@ package community.flock.wirespec.integration.spring.kotlin +import community.flock.wirespec.compiler.utils.noLogger import community.flock.wirespec.integration.spring.kotlin.emit.SpringKotlinEmitter import community.flock.wirespec.openapi.v3.OpenApiV3Parser import java.io.File @@ -10,7 +11,7 @@ class GenerateTestClasses { private val basePkg = "community.flock.wirespec.integration.spring.kotlin" private val kotlinPkg = "${basePkg}.generated" - private val kotlinEmitter = SpringKotlinEmitter(kotlinPkg) + private val kotlinEmitter = SpringKotlinEmitter(kotlinPkg, noLogger) private fun pkgToPath(pkg: String) = pkg.split(".").joinToString("/") @@ -29,4 +30,3 @@ class GenerateTestClasses { } } } - diff --git a/src/plugin/arguments/src/commonMain/kotlin/community/flock/wirespec/plugin/CompilerUtil.kt b/src/plugin/arguments/src/commonMain/kotlin/community/flock/wirespec/plugin/CompilerUtil.kt index 12525ede9..f1ad5ecb2 100644 --- a/src/plugin/arguments/src/commonMain/kotlin/community/flock/wirespec/plugin/CompilerUtil.kt +++ b/src/plugin/arguments/src/commonMain/kotlin/community/flock/wirespec/plugin/CompilerUtil.kt @@ -1,6 +1,7 @@ package community.flock.wirespec.plugin import arrow.core.Either +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.emit.JavaEmitter import community.flock.wirespec.compiler.core.emit.KotlinEmitter @@ -30,13 +31,17 @@ import community.flock.wirespec.plugin.Language.Wirespec typealias FilesContent = List> fun FilesContent.parse(logger: Logger): List>> = - map { (name, source) -> name to WirespecSpec.parse(source)(logger) } - .map { (name, result) -> - name to when (result) { - is Either.Right -> result.value - is Either.Left -> error("compile error: ${result.value}") - } + map { (name, source) -> + name to object : ParseContext { + override val spec = WirespecSpec + override val logger = logger + }.parse(source) + }.map { (name, result) -> + name to when (result) { + is Either.Right -> result.value + is Either.Left -> error("compile error: ${result.value}") } + } fun FilesContent.compile(logger: Logger, emitter: Emitter) = parse(logger) diff --git a/src/plugin/cli/src/commonMain/kotlin/community/flock/wirespec/plugin/cli/Main.kt b/src/plugin/cli/src/commonMain/kotlin/community/flock/wirespec/plugin/cli/Main.kt index 1cd953ef6..2ec22dbf5 100644 --- a/src/plugin/cli/src/commonMain/kotlin/community/flock/wirespec/plugin/cli/Main.kt +++ b/src/plugin/cli/src/commonMain/kotlin/community/flock/wirespec/plugin/cli/Main.kt @@ -5,7 +5,7 @@ import arrow.core.NonEmptyList import arrow.core.left import arrow.core.nel import arrow.core.right -import community.flock.wirespec.compiler.core.WirespecSpec +import community.flock.wirespec.compiler.core.CompilationContext import community.flock.wirespec.compiler.core.compile import community.flock.wirespec.compiler.core.component1 import community.flock.wirespec.compiler.core.emit.JavaEmitter @@ -59,7 +59,8 @@ fun main(args: Array) { .let(WirespecCli.provide(::compile, ::convert, ::write)) } -fun convert(arguments: CompilerArguments): List, Pair, File?>>> = compile(arguments) +fun convert(arguments: CompilerArguments): List, Pair, File?>>> = + compile(arguments) fun compile(arguments: CompilerArguments): List, Pair, File?>>> { @@ -122,10 +123,12 @@ private fun Reader.wirespec( path: (FileExtension) -> FullFilePath, logger: Logger ) = read() - .let(WirespecSpec::compile)(logger) - .let { compiler -> + .let { source -> languages.emitters(packageName, path, logger).map { (emitter, file) -> - val results = compiler(emitter) + val results = object : CompilationContext { + override val logger = logger + override val emitter = emitter + }.compile(source) if (!emitter.split) results.map { listOf( Emitted( diff --git a/src/plugin/cli/src/jsMain/kotlin/community/flock/wirespec/plugin/cli/Cli.kt b/src/plugin/cli/src/jsMain/kotlin/community/flock/wirespec/plugin/cli/Cli.kt index c60108979..6f17c6b61 100644 --- a/src/plugin/cli/src/jsMain/kotlin/community/flock/wirespec/plugin/cli/Cli.kt +++ b/src/plugin/cli/src/jsMain/kotlin/community/flock/wirespec/plugin/cli/Cli.kt @@ -2,12 +2,11 @@ package community.flock.wirespec.plugin.cli -import community.flock.wirespec.compiler.core.WirespecSpec +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.core.parse.Definition import community.flock.wirespec.compiler.lib.WsNode import community.flock.wirespec.compiler.lib.produce - import community.flock.wirespec.compiler.utils.noLogger @JsExport @@ -16,11 +15,11 @@ fun cli(args: Array) { } @JsExport -fun parser(source: String): Array { - return WirespecSpec.parse(source)(noLogger).getOrNull() +fun parser(source: String): Array = + object : ParseContext { + override val logger = noLogger + }.parse(source).getOrNull() ?.filterIsInstance() ?.map { it.produce() } ?.toTypedArray() ?: error("Cannot parse source") -} - diff --git a/src/plugin/npm/src/commonTest/kotlin/community/flock/wirespec/plugin/npm/MainTest.kt b/src/plugin/npm/src/commonTest/kotlin/community/flock/wirespec/plugin/npm/MainTest.kt index 7884f823a..9eba29c61 100644 --- a/src/plugin/npm/src/commonTest/kotlin/community/flock/wirespec/plugin/npm/MainTest.kt +++ b/src/plugin/npm/src/commonTest/kotlin/community/flock/wirespec/plugin/npm/MainTest.kt @@ -1,6 +1,7 @@ package community.flock.wirespec.plugin.npm import com.goncalossilva.resources.Resource +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.lib.produce @@ -14,11 +15,14 @@ class MainTest { @Test fun testEmit() { val file = Resource("src/commonTest/resources/person.ws").readText() - val res = WirespecSpec.parse(file)(noLogger).getOrNull() + val res = object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(file).getOrNull() assertNotNull(res) val openApiV2 = emit(res.produce(), Emitters.OPENAPI_V2, "") val openApiV3 = emit(res.produce(), Emitters.OPENAPI_V3, "") assertEquals("""{"swagger":"2.0"""", openApiV2.first().result.substring(0, 16)) assertEquals("""{"openapi":"3.0.0"""", openApiV3.first().result.substring(0, 18)) } -} \ No newline at end of file +} diff --git a/src/plugin/npm/src/jsMain/kotlin/community/flock/wirespec/plugin/npm/Main.kt b/src/plugin/npm/src/jsMain/kotlin/community/flock/wirespec/plugin/npm/Main.kt index 761e69db2..df66a5af7 100644 --- a/src/plugin/npm/src/jsMain/kotlin/community/flock/wirespec/plugin/npm/Main.kt +++ b/src/plugin/npm/src/jsMain/kotlin/community/flock/wirespec/plugin/npm/Main.kt @@ -5,6 +5,7 @@ package community.flock.wirespec.plugin.npm import arrow.core.curried import community.flock.kotlinx.openapi.bindings.v2.SwaggerObject import community.flock.kotlinx.openapi.bindings.v3.OpenAPIObject +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.emit.JavaEmitter import community.flock.wirespec.compiler.core.emit.KotlinEmitter @@ -12,7 +13,7 @@ import community.flock.wirespec.compiler.core.emit.ScalaEmitter import community.flock.wirespec.compiler.core.emit.TypeScriptEmitter import community.flock.wirespec.compiler.core.emit.WirespecEmitter import community.flock.wirespec.compiler.core.emit.common.Emitted -import community.flock.wirespec.compiler.core.parse.Parser +import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.core.tokenize.tokenize import community.flock.wirespec.compiler.lib.WsNode import community.flock.wirespec.compiler.lib.WsStringResult @@ -55,10 +56,9 @@ fun tokenize(source: String) = WirespecSpec .toTypedArray() @JsExport -fun parse(source: String) = WirespecSpec - .tokenize(source) - .let(Parser(noLogger)::parse) - .produce() +fun parse(source: String) = object : ParseContext { + override val logger = noLogger +}.parse(source).produce() @JsExport fun convert(source: String, converters: Converters) = when (converters) { @@ -67,9 +67,9 @@ fun convert(source: String, converters: Converters) = when (converters) { } @JsExport -fun generate(source: String, type: String): WsStringResult = WirespecSpec - .tokenize(source) - .let(Parser(noLogger)::parse) +fun generate(source: String, type: String): WsStringResult = object : ParseContext { + override val logger = noLogger +}.parse(source) .map { it.generate(type).toString() } .produce() @@ -78,18 +78,18 @@ fun emit(ast: Array, emitter: Emitters, packageName: String) = ast .map { it.consume() } .let { when (emitter) { - Emitters.WIRESPEC -> WirespecEmitter().emit(it) - Emitters.TYPESCRIPT -> TypeScriptEmitter().emit(it) - Emitters.JAVA -> JavaEmitter(packageName).emit(it) - Emitters.KOTLIN -> KotlinEmitter(packageName).emit(it) - Emitters.SCALA -> ScalaEmitter(packageName).emit(it) + Emitters.WIRESPEC -> WirespecEmitter(logger = noLogger).emit(it) + Emitters.TYPESCRIPT -> TypeScriptEmitter(logger = noLogger).emit(it) + Emitters.JAVA -> JavaEmitter(packageName, logger = noLogger).emit(it) + Emitters.KOTLIN -> KotlinEmitter(packageName, logger = noLogger).emit(it) + Emitters.SCALA -> ScalaEmitter(packageName, logger = noLogger).emit(it) Emitters.OPENAPI_V2 -> listOf(it) .map(OpenApiV2Emitter::emitSwaggerObject) .map(encode(SwaggerObject.serializer())) .map(::Emitted.curried()("openapi")::invoke) Emitters.OPENAPI_V3 -> listOf(it) - .map{ast -> OpenApiV3Emitter.emitOpenAPIObject(ast, null)} + .map { ast -> OpenApiV3Emitter.emitOpenAPIObject(ast, null) } .map(encode(OpenAPIObject.serializer())) .map(::Emitted.curried()("openapi")::invoke) } diff --git a/src/tools/generator/src/commonTest/kotlin/community/flock/wirespec/generator/GeneratorTest.kt b/src/tools/generator/src/commonTest/kotlin/community/flock/wirespec/generator/GeneratorTest.kt index b8857833f..8e24282d5 100644 --- a/src/tools/generator/src/commonTest/kotlin/community/flock/wirespec/generator/GeneratorTest.kt +++ b/src/tools/generator/src/commonTest/kotlin/community/flock/wirespec/generator/GeneratorTest.kt @@ -1,17 +1,18 @@ package community.flock.wirespec.generator import arrow.core.getOrElse +import community.flock.wirespec.compiler.core.ParseContext import community.flock.wirespec.compiler.core.WirespecSpec import community.flock.wirespec.compiler.core.parse import community.flock.wirespec.compiler.core.parse.Reference.Primitive import community.flock.wirespec.compiler.core.parse.Reference.Primitive.Type import community.flock.wirespec.compiler.utils.noLogger -import kotlinx.serialization.json.jsonArray -import kotlinx.serialization.json.jsonPrimitive import kotlin.random.Random import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonPrimitive class GeneratorTest { @@ -44,9 +45,6 @@ class GeneratorTest { |} """.trimMargin() - private fun parser(source: String) = - WirespecSpec.parse(source)(noLogger).getOrElse { e -> error("Cannot parse: ${e.map { it.message }}") } - @Test fun generateAddress() { val ast = parser(src) @@ -85,4 +83,10 @@ class GeneratorTest { assertEquals(5, res.jsonArray.size) } + private fun parser(source: String) = + object : ParseContext { + override val spec = WirespecSpec + override val logger = noLogger + }.parse(source).getOrElse { e -> error("Cannot parse: ${e.map { it.message }}") } + }