From dacbf0e7715ba9514232eb9f05e560e7340a23c4 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Tue, 7 Nov 2023 11:16:57 +0100 Subject: [PATCH 1/8] update dependencies --- .../ee/design/gen/angular/DesignAngularPojos.kt | 2 +- gradle.properties | 12 ++++++------ gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularPojos.kt b/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularPojos.kt index c302073..56f3c96 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularPojos.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularPojos.kt @@ -287,7 +287,7 @@ a { """ } -fun > T.toAngularEntityListHTMLComponent(c: GenerationContext, DataService: String = AngularDerivedType.DataService, isAggregateView: Boolean = false, containAggregateProp: Boolean = false, entities: List>): String { +fun > T.toAngularEntityListHTMLComponent(c: GenerationContext, DataService: String = AngularDerivedType.DataService, isAggregateView: Boolean = false, containAggregateProp: Boolean = false, entities: List> = emptyList()): String { val serviceName = if(this.parent().name().equals(this.name(), true)) {this.parent().name().toCamelCase() .replaceFirstChar { it.lowercase(Locale.getDefault()) }} else {this.parent().name().toCamelCase() .replaceFirstChar { it.lowercase(Locale.getDefault()) } + this.name().toCamelCase().replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }} diff --git a/gradle.properties b/gradle.properties index b80dca3..cf1ef41 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,13 +6,13 @@ eeVersion=dev-SNAPSHOT #version=1.4.2 group=ee -gradleVersion=8.1.1 -kotlinVersion=1.8.21 -kotlinCoroutinesVersion=1.6.4 -springBootVersion=3.0.6 +gradleVersion=8.4 +kotlinVersion=1.9.20 +kotlinCoroutinesVersion=1.7.3 +springBootVersion=3.1.5 -version_docx4j=6.1.2 -version_swagger=1.0.65 +version_docx4j=11.4.9 +version_swagger=1.0.68 version_xsom=20140925 version_json_schema_networknt=1.0.29 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c920b87..d335935 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip From bcb701959f1ae0a5b989e9ef8850146b80ba9011 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Tue, 7 Nov 2023 13:12:22 +0100 Subject: [PATCH 2/8] accessible generatorFactory --- ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt index 56d88a8..7a83c72 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt @@ -9,7 +9,7 @@ import java.nio.file.Path open class DesignGoGenerator(private val models: List>, targetAsSingleModule: Boolean = true) { private val log = LoggerFactory.getLogger(javaClass) - private val generatorFactory = DesignGeneratorFactory(targetAsSingleModule) + val generatorFactory = DesignGeneratorFactory(targetAsSingleModule) init { models.extendForGoGeneration() From ad3d637af8d0a015804057cb46c56be7e17a48e3 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Tue, 7 Nov 2023 18:47:17 +0100 Subject: [PATCH 3/8] accessible generatorFactory --- .../src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt | 2 +- ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt b/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt index 17dfb56..ef3c891 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt @@ -49,7 +49,7 @@ fun StructureUnitI<*>.addEsArtifacts() { controller { name(DesignDerivedType.HttpRouter).derivedAsType(DesignDerivedType.Http) entities.forEach { entity -> - val entityProj = "${entity.name()}Projector" + val entityProj = "${entity.name()}${DesignDerivedType.Projector}" val p = prop { name(entityProj.replaceFirstChar { it.lowercase(Locale.getDefault()) }).type(Type().name(entityProj)).default().notInitByDefaultTypeValue() } diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt b/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt index 55f5442..a540dcf 100644 --- a/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt +++ b/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt @@ -359,14 +359,14 @@ fun > T.extendForGoGenerationLang(): T { return this } -fun AttributeI<*>.nameForGoMember(): String = storage.getOrPut(this, "nameForGoMember", { +fun AttributeI<*>.nameForGoMember(): String = storage.getOrPut(this, "nameForGoMember") { val name = name() isReplaceable().notSetOrTrue().ifElse({ name.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() } }, { name.replaceFirstChar { it.lowercase(Locale.getDefault()) } }) -}) +} val itemAndTemplateNameAsGoFileName: TemplateI<*>.(CompositeI<*>) -> Names = { Names("${it.name().toUnderscoredLowerCase()}_${name.toUnderscoredLowerCase()}.go") From 55dfe6e802e46d56f6383d2dfadda64b5c95d7b3 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Thu, 9 Nov 2023 14:12:37 +0100 Subject: [PATCH 4/8] simplify structures --- .../ee/design/gen/DesignGeneratorFactory.kt | 872 ------------------ .../gen/angular/DesignAngularGenerator.kt | 245 ++++- .../ee/design/gen/doc/DesignDocGenerator.kt | 47 +- .../ee/design/gen/go/DesignGoGenerator.kt | 538 ++++++++++- .../ee/design/gen/kt/DesignKotlinGenerator.kt | 7 +- .../gen/ts/DesignTypeScriptGenerator.kt | 88 +- .../main/kotlin/ee/design/DesignGenerator.kt | 4 +- .../ee/lang/gen/LangGeneratorFactory.kt | 377 -------- .../ee/lang/gen/doc/LangDocGenerator.kt | 48 + .../kotlin/ee/lang/gen/go/LangGoGenerator.kt | 39 + .../ee/lang/gen/kt/LangKotlinGenerator.kt | 299 ++++++ .../src/main/kotlin/ee/lang/DerivedSupport.kt | 2 +- 12 files changed, 1287 insertions(+), 1279 deletions(-) delete mode 100644 ee-design/src/main/kotlin/ee/design/gen/DesignGeneratorFactory.kt delete mode 100644 ee-lang/src/main/kotlin/ee/lang/gen/LangGeneratorFactory.kt create mode 100644 ee-lang/src/main/kotlin/ee/lang/gen/doc/LangDocGenerator.kt create mode 100644 ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoGenerator.kt create mode 100644 ee-lang/src/main/kotlin/ee/lang/gen/kt/LangKotlinGenerator.kt diff --git a/ee-design/src/main/kotlin/ee/design/gen/DesignGeneratorFactory.kt b/ee-design/src/main/kotlin/ee/design/gen/DesignGeneratorFactory.kt deleted file mode 100644 index f568f3f..0000000 --- a/ee-design/src/main/kotlin/ee/design/gen/DesignGeneratorFactory.kt +++ /dev/null @@ -1,872 +0,0 @@ -package ee.design.gen - -import ee.design.* -import ee.design.gen.go.* -import ee.design.gen.kt.DesignKotlinContextFactory -import ee.design.gen.kt.DesignKotlinTemplates -import ee.design.gen.swagger.DesignSwaggerContextFactory -import ee.design.gen.swagger.DesignSwaggerTemplates -import ee.design.gen.ts.DesignTsContextFactory -import ee.design.gen.ts.DesignTsTemplates -import ee.design.gen.angular.DesignAngularContextFactory -import ee.design.gen.angular.DesignAngularTemplates -import ee.design.gen.doc.DesignDocContextFactory -import ee.design.gen.doc.DesignDocTemplates -import ee.lang.* -import ee.lang.gen.LangGeneratorFactory -import ee.lang.gen.common.LangCommonContextFactory -import ee.lang.gen.doc.markdownClassDiagram -import ee.lang.gen.go.itemAndTemplateNameAsGoFileName -import ee.lang.gen.go.itemNameAsGoFileName -import ee.lang.gen.itemNameAsKotlinFileName -import ee.lang.gen.swagger.itemNameAsSwaggerFileName -import ee.lang.gen.ts.* - -open class DesignGeneratorFactory(targetAsSingleModule: Boolean = true) : LangGeneratorFactory(targetAsSingleModule) { - - override fun buildKotlinContextFactory() = DesignKotlinContextFactory(targetAsSingleModule) - override fun buildKotlinTemplates() = DesignKotlinTemplates(itemNameAsKotlinFileName) - - override fun buildGoContextFactory() = DesignGoContextFactory(targetAsSingleModule) - override fun buildGoTemplates() = DesignGoTemplates(itemNameAsGoFileName) - - override fun buildTsContextFactory() = DesignTsContextFactory(false) - override fun buildTsTemplates() = DesignTsTemplates(itemNameAsTsFileName) - - override fun buildDocContextFactory() = DesignDocContextFactory(targetAsSingleModule) - override fun buildDocTemplates() = DesignDocTemplates(itemNameAsTsFileName) - - fun buildAngularContextFactory() = DesignAngularContextFactory() - fun buildAngularTemplates() = DesignAngularTemplates(itemNameAsTsFileName) - - override fun buildSwaggerContextFactory() = DesignSwaggerContextFactory() - fun buildSwaggerTemplates() = DesignSwaggerTemplates(itemNameAsSwaggerFileName) - - - open fun go(fileNamePrefix: String = ""): GeneratorContexts> { - - val goTemplates = buildGoTemplates() - val contextFactory = buildGoContextFactory() - val goContextBuilderIfcOrImplOnly = contextFactory.buildForImplOnly() - val goContextBuilderIfcAndImpl = contextFactory.buildForIfcAndImpl() - - val components: StructureUnitI<*>.() -> List> = { - if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) - } - - val modules: StructureUnitI<*>.() -> List> = { - val ret = if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) - ret - } - - val enums: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(EnumTypeI::class.java).filter { - it.parent() is StructureUnitI<*> && it.derivedAsType().isEmpty() - }.sortedBy { it.name() } - ret - } - - val interfaces: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } - } - - val values: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(ValuesI::class.java).filter { - !it.isIfc() && it.derivedAsType().isEmpty() - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - ret - } - - val basics: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(BasicI::class.java).filter { - !it.isIfc() && it.derivedAsType().isEmpty() - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - ret - } - - val entities: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(EntityI::class.java).filter { - !it.isIfc() && it.derivedAsType().isEmpty() - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - ret - } - - val states: StructureUnitI<*>.() -> List> = { - findDownByType(StateI::class.java).filter { - !it.isIfc() && it.derivedAsType().isEmpty() - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val controllersWithOutOps: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(ControllerI::class.java).filter { - !it.isIfc() && it.derivedAsType().isEmpty() && it.operations().isEmpty() - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - ret - } - - val controllersWithOps: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(ControllerI::class.java).filter { - !it.isIfc() && it.derivedAsType().isEmpty() && it.operations().isNotEmpty() - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - ret - } - - registerGoMacros(contextFactory) - - val moduleGenerators = mutableListOf>>() - val generator = GeneratorGroup( - "go", listOf( - GeneratorGroupItems( - "modulesGenerators", - items = modules, generators = moduleGenerators - ) - ) - ) - - moduleGenerators.addAll( - listOf( - GeneratorSimple( - "ifc_base", contextBuilder = goContextBuilderIfcOrImplOnly, - template = FragmentsTemplate(name = "${fileNamePrefix}ifc_base", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(goTemplates.ifc()) - })) - }) - ), - GeneratorSimple( - "_api_base", contextBuilder = goContextBuilderIfcOrImplOnly, - template = FragmentsTemplate(name = "${fileNamePrefix}api_base", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf( - ItemsFragment(items = entities, fragments = { listOf(goTemplates.entity()) }), - ItemsFragment, CompilationUnitI<*>>(items = values, - fragments = { listOf(goTemplates.pojo()) }), - ItemsFragment, CompilationUnitI<*>>(items = basics, - fragments = { listOf(goTemplates.pojo()) }), - ItemsFragment(items = enums, fragments = { listOf(goTemplates.enum()) }), - ItemsFragment(items = controllersWithOutOps, fragments = { listOf(goTemplates.pojo()) }) - ) - }) - ), - GeneratorSimple( - "ifc_api_base", contextBuilder = goContextBuilderIfcAndImpl, - template = FragmentsTemplate(name = "${fileNamePrefix}ifc_api_base", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf( - ItemsFragment(items = controllersWithOps, fragments = { - listOf(goTemplates.ifc()) - }), - ItemsFragment(items = controllersWithOps, fragments = { - listOf(goTemplates.pojo()) - }) - ) - }) - ), - GeneratorSimple( - "_test_base", contextBuilder = goContextBuilderIfcOrImplOnly, - template = FragmentsTemplate(name = "${fileNamePrefix}test_base", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf( - ItemsFragment(items = entities, fragments = { listOf(goTemplates.newTestInstance()) }), - ItemsFragment, CompilationUnitI<*>>(items = values, - fragments = { listOf(goTemplates.newTestInstance()) }), - ItemsFragment, CompilationUnitI<*>>(items = basics, - fragments = { listOf(goTemplates.newTestInstance()) }) - ) - }) - ) - ) - ) - - //val derivedTypes = mutableListOf(DesignDerivedType.Aggregate, DesignDerivedType.Query, DesignDerivedType.Http, - // DesignDerivedType.Client, DesignDerivedType.Cli, DesignDerivedType.StateMachine) - val derivedTypes: List = emptyList() - val derivedTypesGenerators = derivedTypes.map { derivedType -> - GeneratorSimple( - "${derivedType}_base", contextBuilder = goContextBuilderIfcOrImplOnly, - template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}_base", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf( - ItemsFragment(items = { - findDownByType(ControllerI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - }, fragments = { listOf(goTemplates.ifcOrPojo()) }), - ItemsFragment(items = { - findDownByType(ValuesI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - }, fragments = { listOf(goTemplates.ifcOrPojo()) }), - ItemsFragment(items = { - findDownByType(BasicI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - }, fragments = { listOf(goTemplates.ifcOrPojo()) }), - ItemsFragment(items = { - findDownByType(EnumTypeI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - }, fragments = { listOf(goTemplates.enum()) }) - ) - }) - ) - } - moduleGenerators.addAll(derivedTypesGenerators) - - return GeneratorContexts(generator, goContextBuilderIfcOrImplOnly) - } - - open fun goEventDriven(fileNamePrefix: String = ""): GeneratorContexts> { - - val swaggerTemplates = buildSwaggerTemplates() - val swaggerContextFactory = buildSwaggerContextFactory() - val swaggerContextBuilder = swaggerContextFactory.build() - - val goTemplates = buildGoTemplates() - val contextFactory = buildGoContextFactory() - val goContextBuilder = contextFactory.buildForImplOnly() - - val components: StructureUnitI<*>.() -> List> = { - if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) - } - - val modules: StructureUnitI<*>.() -> List> = { - if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) - } - - registerGoMacros(contextFactory) - - val moduleGenerators = mutableListOf>>() - val generator = GeneratorGroup( - "eventDrivenGo", listOf( - GeneratorGroupItems( - "modulesGenerators", - items = modules, generators = moduleGenerators - ), - GeneratorItems("swaggerComponent", contextBuilder = swaggerContextBuilder, items = components, - templates = { listOf(swaggerTemplates.model()) }) - ) - ) - - moduleGenerators.addAll( - listOf( - - ) - ) - - val derivedTypes = mutableListOf( - "", - DesignDerivedType.Aggregate, - DesignDerivedType.AggregateEvents, - DesignDerivedType.AggregateCommands, - DesignDerivedType.Query, - DesignDerivedType.Http, - DesignDerivedType.Client, - DesignDerivedType.Cli, - DesignDerivedType.StateMachine, - DesignDerivedType.StateMachineEvents, - DesignDerivedType.StateMachineCommands, - ) - - derivedTypes.forEach { derivedType -> - - val controllers: StructureUnitI<*>.() -> Collection> = { - findDownByType(type = ControllerI::class.java, stopSteppingDownIfFound = false).filter { - !it.isIfc() && it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val commands: StructureUnitI<*>.() -> List> = { - findDownByType(CommandI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val eventsWithData: StructureUnitI<*>.() -> List> = { - findDownByType(EventI::class.java).filter { - it.props().isNotEmpty() && it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val enums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { it.name() } - } - - val interfaces: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java, stopSteppingDownIfFound = false).filter { - it.isIfc() && it.derivedAsType().equals(derivedType, true) - }.sortedBy { it.name() } - } - - val values: StructureUnitI<*>.() -> List> = { - findDownByType(ValuesI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val basics: StructureUnitI<*>.() -> List> = { - findDownByType(BasicI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val entities: StructureUnitI<*>.() -> List> = { - val retEntities = findDownByType(EntityI::class.java).filter { - it.derivedAsType().equals(derivedType, true) - }.sortedBy { "${it.javaClass.simpleName} ${name()}" } - retEntities.forEach { - it.propIdOrAdd() - it.propDeletedAt() - } - retEntities - } - - moduleGenerators.add( - GeneratorSimple( - "IfcBase", contextBuilder = goContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}IfcBase", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(goTemplates.ifc()) - })) - }) - ) - ) - moduleGenerators.add( - GeneratorSimple( - "ApiBase", contextBuilder = goContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}ApiBase", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf( - ItemsFragment(items = entities, fragments = { listOf(goTemplates.entity()) }), - ItemsFragment(items = controllers, fragments = { listOf(goTemplates.pojo()) }), - ItemsFragment, CompilationUnitI<*>>(items = values, - fragments = { listOf(goTemplates.pojo()) }), - ItemsFragment, CompilationUnitI<*>>(items = basics, - fragments = { listOf(goTemplates.pojo()) }), - ItemsFragment(items = enums, fragments = { listOf(goTemplates.enum()) }) - ) - }) - ) - ) - - moduleGenerators.add( - GeneratorSimple( - "TestBase", contextBuilder = goContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}TestBase", - nameBuilder = itemAndTemplateNameAsGoFileName, - fragments = { - listOf( - ItemsFragment(items = entities, - fragments = { listOf(goTemplates.newTestInstance()) }), - ItemsFragment, CompilationUnitI<*>>(items = values, - fragments = { listOf(goTemplates.newTestInstance()) }), - ItemsFragment, CompilationUnitI<*>>(items = basics, - fragments = { listOf(goTemplates.newTestInstance()) }) - ) - }) - ) - ) - moduleGenerators.add( - GeneratorSimple( - "CommandsBase", contextBuilder = goContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}EsCommandsBase", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf( - ItemsFragment(items = entities, fragments = { listOf(goTemplates.commandTypes()) }), - ItemsFragment(items = commands, fragments = { listOf(goTemplates.command()) }), - ) - }) - ) - ) - moduleGenerators.add( - GeneratorSimple( - "EventsBase", contextBuilder = goContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}EsEventsBase", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf( - ItemsFragment(items = entities, fragments = { listOf(goTemplates.eventTypes()) }), - ItemsFragment( - items = eventsWithData, - fragments = { listOf(goTemplates.pojoExcludePropsWithValue()) }), - ) - }) - ) - ) - } - - return GeneratorContexts(generator, swaggerContextBuilder, goContextBuilder) - } - - open fun typeScriptApiBase(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { - val tsTemplates = buildTsTemplates() - val tsContextFactory = buildTsContextFactory() - val tsContextBuilder = tsContextFactory.buildForImplOnly() - - val components: StructureUnitI<*>.() -> List> = { - if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) - } - val modules: StructureUnitI<*>.() -> List> = { - if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) - } - - val commands: StructureUnitI<*>.() -> List> = { findDownByType(CommandI::class.java) } - val commandEnums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.parent() is ControllerI<*> && it.name().endsWith("CommandType") - } - } - - val events: StructureUnitI<*>.() -> List> = { findDownByType(EventI::class.java) } - val eventEnums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.parent() is ControllerI<*> && it.name().endsWith("EventType") - } - } - - val enums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.parent() is StructureUnitI<*> && it.derivedAsType().isEmpty() - }.sortedBy { it.name() } - } - - val values: StructureUnitI<*>.() -> List> = { - findDownByType(ValuesI::class.java).filter { it.derivedAsType().isEmpty() } - .sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val basics: StructureUnitI<*>.() -> List> = { - findDownByType(BasicI::class.java).filter { it.derivedAsType().isEmpty() } - .sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val entities: StructureUnitI<*>.() -> List> = { - findDownByType(EntityI::class.java).filter { it.derivedAsType().isEmpty() } - .sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val moduleGenerators = mutableListOf>>() - val generator = GeneratorGroup( - "angular", - listOf(GeneratorGroupItems("angularModules", items = modules, generators = moduleGenerators)) - ) - - moduleGenerators.addAll( - listOf( - GeneratorSimple( - "ApiBase", contextBuilder = tsContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", - nameBuilder = itemAndTemplateNameAsTsFileName, fragments = { - listOf( - ItemsFragment, CompilationUnitI<*>>(items = entities, - fragments = { listOf(tsTemplates.pojo()) }), - ItemsFragment, CompilationUnitI<*>>(items = values, - fragments = { listOf(tsTemplates.pojo()) }), - ItemsFragment, CompilationUnitI<*>>(items = basics, - fragments = { listOf(tsTemplates.pojo()) }), - ItemsFragment(items = enums, fragments = { listOf(tsTemplates.enum()) }) - ) - }) - ), - ) - ) - - return GeneratorContexts(generator, tsContextBuilder) - } - - private fun buildTsContextFactoryAngular() = DesignTsContextFactory(false) - - open fun angular(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { - val angularTemplates = DesignAngularTemplates(itemNameAsTsFileName) - val tsTemplates = DesignTsTemplates(itemNameAsTsFileName) - val tsContextFactory = buildTsContextFactoryAngular() - - val components: StructureUnitI<*>.() -> List> = { - if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) - } - val modules: StructureUnitI<*>.() -> List> = { - if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) - } - - val commands: StructureUnitI<*>.() -> List> = { findDownByType(CommandI::class.java) } - val commandEnums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.parent() is ControllerI<*> && it.name().endsWith("CommandType") - } - } - - val events: StructureUnitI<*>.() -> List> = { findDownByType(EventI::class.java) } - val eventEnums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.parent() is ControllerI<*> && it.name().endsWith("EventType") - } - } - - val enums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.parent() is StructureUnitI<*> && it.derivedAsType().isEmpty() - }.sortedBy { it.name() } - } - - val values: StructureUnitI<*>.() -> List> = { - findDownByType(ValuesI::class.java).filter { it.derivedAsType().isEmpty() } - .sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val basics: StructureUnitI<*>.() -> List> = { - findDownByType(BasicI::class.java).filter { it.derivedAsType().isEmpty() } - .sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val entities: StructureUnitI<*>.() -> List> = { - findDownByType(EntityI::class.java).filter { it.derivedAsType().isEmpty() } - .sortedBy { "${it.javaClass.simpleName} ${name()}" } - } - - val aggregateEntities: StructureUnitI<*>.() -> List> = { - findDownByType(EntityI::class.java).filter { it.belongsToAggregate().derivedAsType().isEmpty() && it.belongsToAggregate().isNotEMPTY() } - .sortedBy { "${it.belongsToAggregate().javaClass.simpleName} ${name()}" }.map { it.belongsToAggregate() } - } - - val moduleGenerators = mutableListOf>>() - val generator = GeneratorGroup( - "Angular", - listOf(GeneratorGroupItems("AngularModules", items = modules, generators = moduleGenerators)) - ) - - // View Component for Modules - val moduleViewComponentContextBuilder = tsContextFactory.buildForImplOnly("/components/view") - moduleGenerators.add(GeneratorItems("AngularModuleViewComponent", - contextBuilder = moduleViewComponentContextBuilder, items = modules, - - templates = { - listOf( - tsTemplates.moduleTypeScript(angularModuleViewComponent.ts), - angularTemplates.moduleHTML(angularModuleViewComponent.html), - angularTemplates.moduleSCSS(angularModuleViewComponent.scss), - ) })) - - // Module & Routing Component for Modules - val moduleModulesContextBuilder = tsContextFactory.buildForImplOnly() - moduleGenerators.add(GeneratorItems("AngularModules", - contextBuilder = moduleModulesContextBuilder, items = modules, - - templates = { - listOf( - angularTemplates.angularModule(angularModule.ts, components.invoke(model)), - angularTemplates.angularRoutingModule(angularRoutingModule.ts), - ) })) - - // Module Service - val moduleServiceContextBuilder = tsContextFactory.buildForImplOnly("/service") - moduleGenerators.add(GeneratorItems("AngularModulesService", - contextBuilder = moduleServiceContextBuilder, items = modules, - - templates = { - listOf( - tsTemplates.moduleService(modules.invoke(model), angularModuleService.ts) - ) })) - - // View, List, Form, Service Components for Entities - val entityComponentContextBuilder = tsContextFactory.buildForImplOnly() - moduleGenerators.add(GeneratorItems("AngularEntityComponent", - contextBuilder = entityComponentContextBuilder, items = entities, - - templates = { - listOf( - tsTemplates.entityViewTypeScript(angularEntityViewComponent.ts), - angularTemplates.entityViewHTML(entities.invoke(model), angularEntityViewComponent.html), - angularTemplates.entityViewSCSS(angularEntityViewComponent.scss), - - tsTemplates.entityFormTypeScript(angularEntityFormComponent.ts), - angularTemplates.entityFormHTML(angularEntityFormComponent.html), - angularTemplates.entityFormSCSS(angularEntityFormComponent.scss), - - tsTemplates.entityListTypeScript(angularEntityListComponent.ts), - angularTemplates.entityListHTML(angularEntityListComponent.html, aggregateEntities.invoke(model), entities.invoke(model)), - angularTemplates.entityListSCSS(angularEntityListComponent.scss), - - tsTemplates.entityDataService(entities.invoke(model), angularEntityService.ts) - ) })) - - // View, List, Form Components for Aggregate Entity - val aggregateEntityComponentContextBuilder = tsContextFactory.buildForImplOnly() - moduleGenerators.add(GeneratorItems("AngularAggregateEntityComponent", - contextBuilder = aggregateEntityComponentContextBuilder, items = aggregateEntities, - - templates = { - listOf( - tsTemplates.entityAggregateViewTypeScript(angularAggregateEntityComponent.ts), - angularTemplates.entityAggregateViewHTML(angularAggregateEntityComponent.html), - angularTemplates.entityAggregateViewSCSS(angularAggregateEntityComponent.scss), - ) })) - - // View, List, Form, Service Components for Values - val valuesComponentContextBuilder = tsContextFactory.buildForImplOnly() - moduleGenerators.add(GeneratorItems("AngularValuesComponent", - contextBuilder = valuesComponentContextBuilder, items = values, - - templates = { - listOf( - tsTemplates.valueViewTypeScript(angularEntityViewComponent.ts), - angularTemplates.entityViewHTML(entities.invoke(model), angularEntityViewComponent.html), - angularTemplates.entityViewSCSS(angularEntityViewComponent.scss), - - tsTemplates.valueFormTypeScript(angularEntityFormComponent.ts), - angularTemplates.entityFormHTML(angularEntityFormComponent.html), - angularTemplates.entityFormSCSS(angularEntityFormComponent.scss), - - tsTemplates.valueListTypeScript(angularEntityListComponent.ts), - angularTemplates.entityListHTML(angularEntityListComponent.html, aggregateEntities.invoke(model), entities.invoke(model)), - angularTemplates.entityListSCSS(angularEntityListComponent.scss), - - tsTemplates.entityDataService(entities.invoke(model), angularEntityService.ts) - ) })) - - // Basics Components - val basicsContextBuilder = tsContextFactory.buildForImplOnly("/basics") - moduleGenerators.add(GeneratorItems("AngularBasics", - contextBuilder = basicsContextBuilder, items = basics, - - templates = { - listOf( - tsTemplates.basicTypeScript(angularBasicComponent.ts), - angularTemplates.basicHTML(angularBasicComponent.html), - angularTemplates.basicSCSS(angularBasicComponent.scss), - ) })) - - // Enums Components - val enumsContextBuilder = tsContextFactory.buildForImplOnly("/enums") - moduleGenerators.add(GeneratorItems("AngularEnums", - contextBuilder = enumsContextBuilder, items = enums, - - templates = { - listOf( - tsTemplates.enumTypeScript(angularEnumComponent.ts), - angularTemplates.enumHTML(angularEnumComponent.html), - angularTemplates.enumSCSS(angularEnumComponent.scss), - ) })) - - return GeneratorContexts(generator, moduleViewComponentContextBuilder, moduleModulesContextBuilder, moduleServiceContextBuilder, - entityComponentContextBuilder, aggregateEntityComponentContextBuilder, basicsContextBuilder, enumsContextBuilder,) - } - - open fun angularTranslate(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { - val tsTemplates = DesignTsTemplates(itemNameAsJsonFileName) - val tsContextFactory = buildTsContextFactoryAngular() - - val components: StructureUnitI<*>.() -> List> = { - if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) - } - - val moduleGenerators = mutableListOf>>() - val generator = GeneratorGroup( - "AngularTranslate", - listOf(GeneratorGroupItems("AngularTranslate", items = components, generators = moduleGenerators)) - ) - - val angularTranslateFileContextFactory = tsContextFactory.buildForImplOnly("/assets/i18n") - moduleGenerators.add(GeneratorItems("AngularTranslate", - contextBuilder = angularTranslateFileContextFactory, items = components, - - templates = { - listOf( - tsTemplates.translateJson(english.json), - tsTemplates.translateJson(germany.json), - tsTemplates.translateJson(france.json), - tsTemplates.translateJson(spain.json), - ) })) - - return GeneratorContexts(generator, angularTranslateFileContextFactory) - } - - open fun docMarkDown(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { - val docTemplates = buildDocTemplates() - val docContextFactory = buildDocContextFactory() - - val components: StructureUnitI<*>.() -> List> = { - if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) - } - - val compilationUnit: StructureUnitI<*>.() -> List> = { - if (this is CompilationUnitI<*>) listOf(this) else findDownByType(CompilationUnitI::class.java) - } - - val moduleGenerators = mutableListOf>>() - val generator = GeneratorGroup( - "doc", - listOf(GeneratorGroupItems("doc", items = components, generators = moduleGenerators)) - ) - - val docContextBuilder = docContextFactory.buildForImplOnly("") - moduleGenerators.add(GeneratorItems("PlantUmlClassDiagram", - contextBuilder = docContextBuilder, items = components, - - templates = { - listOf( - docTemplates.generatePlantUmlClassDiagramComponent(markdownClassDiagram.puml) - ) })) - - return GeneratorContexts(generator, docContextBuilder) - } - - protected fun registerGoMacros(contextFactory: LangCommonContextFactory) { - val macros = contextFactory.macroController - macros.registerMacro( - OperationI<*>::toGoAggregateEngineRegisterCommands.name, - OperationI<*>::toGoAggregateEngineRegisterCommands - ) - macros.registerMacro( - CompilationUnitI<*>::toGoAggregateEngineConst.name, - CompilationUnitI<*>::toGoAggregateEngineConst - ) - macros.registerMacro( - CompilationUnitI<*>::toGoAggregateEngineRegisterForEvents.name, - CompilationUnitI<*>::toGoAggregateEngineRegisterForEvents - ) - - macros.registerMacro( - ConstructorI<*>::toGoAggregateEngineBody.name, - ConstructorI<*>::toGoAggregateEngineBody - ) - - macros.registerMacro( - OperationI<*>::toGoAggregateEngineSetupBody.name, - OperationI<*>::toGoAggregateEngineSetupBody - ) - - macros.registerMacro( - OperationI<*>::toGoAggregateApplyEventBody.name, - OperationI<*>::toGoAggregateApplyEventBody - ) - - macros.registerMacro(ConstructorI<*>::toGoEhEngineBody.name, ConstructorI<*>::toGoEhEngineBody) - macros.registerMacro(OperationI<*>::toGoEhEngineSetupBody.name, OperationI<*>::toGoEhEngineSetupBody) - macros.registerMacro(AttributeI<*>::toGoPropOptionalAfterBody.name, AttributeI<*>::toGoPropOptionalAfterBody) - - macros.registerMacro( - OperationI<*>::toGoStatesCommandHandlerSetupBody.name, - OperationI<*>::toGoStatesCommandHandlerSetupBody - ) - macros.registerMacro( - OperationI<*>::toGoStatesCommandHandlerExecute.name, - OperationI<*>::toGoStatesCommandHandlerExecute - ) - - macros.registerMacro(OperationI<*>::toGoEventHandlerApplyEvent.name, OperationI<*>::toGoEventHandlerApplyEvent) - macros.registerMacro(OperationI<*>::toGoEventHandlerSetupBody.name, OperationI<*>::toGoEventHandlerSetupBody) - macros.registerMacro(OperationI<*>::toGoHttpHandlerBody.name, OperationI<*>::toGoHttpHandlerBody) - macros.registerMacro(OperationI<*>::toGoHttpHandlerIdBasedBody.name, OperationI<*>::toGoHttpHandlerIdBasedBody) - macros.registerMacro(OperationI<*>::toGoHttpHandlerCommandBody.name, OperationI<*>::toGoHttpHandlerCommandBody) - macros.registerMacro(OperationI<*>::toGoSetupHttpRouterBody.name, OperationI<*>::toGoSetupHttpRouterBody) - macros.registerMacro(ConstructorI<*>::toGoHttpRouterBeforeBody.name, ConstructorI<*>::toGoHttpRouterBeforeBody) - macros.registerMacro( - ConstructorI<*>::toGoHttpModuleRouterBeforeBody.name, - ConstructorI<*>::toGoHttpModuleRouterBeforeBody - ) - macros.registerMacro(OperationI<*>::toGoSetupModuleHttpRouter.name, OperationI<*>::toGoSetupModuleHttpRouter) - - macros.registerMacro(OperationI<*>::toGoHttpClientCreateBody.name, OperationI<*>::toGoHttpClientCreateBody) - macros.registerMacro( - OperationI<*>::toGoHttpClientCreateItemsBody.name, - OperationI<*>::toGoHttpClientCreateItemsBody - ) - macros.registerMacro( - OperationI<*>::toGoHttpClientDeleteByIdsBody.name, - OperationI<*>::toGoHttpClientDeleteByIdsBody - ) - macros.registerMacro( - OperationI<*>::toGoHttpClientDeleteByIdBody.name, - OperationI<*>::toGoHttpClientDeleteByIdBody - ) - macros.registerMacro(OperationI<*>::toGoHttpClientFindAllBody.name, OperationI<*>::toGoHttpClientFindAllBody) - macros.registerMacro( - OperationI<*>::toGoHttpClientImportJsonBody.name, - OperationI<*>::toGoHttpClientImportJsonBody - ) - macros.registerMacro( - OperationI<*>::toGoHttpClientExportJsonBody.name, - OperationI<*>::toGoHttpClientExportJsonBody - ) - - macros.registerMacro( - OperationI<*>::toGoHttpClientReadFileJsonBody.name, - OperationI<*>::toGoHttpClientReadFileJsonBody - ) - macros.registerMacro(ConstructorI<*>::toGoHttpClientBeforeBody.name, ConstructorI<*>::toGoHttpClientBeforeBody) - macros.registerMacro( - ConstructorI<*>::toGoHttpModuleClientBeforeBody.name, - ConstructorI<*>::toGoHttpModuleClientBeforeBody - ) - - macros.registerMacro(ConstructorI<*>::toGoCliBeforeBody.name, ConstructorI<*>::toGoCliBeforeBody) - - macros.registerMacro(OperationI<*>::toGoCliBuildCommands.name, OperationI<*>::toGoCliBuildCommands) - macros.registerMacro(OperationI<*>::toGoCliDeleteByIdBody.name, OperationI<*>::toGoCliDeleteByIdBody) - macros.registerMacro(OperationI<*>::toGoCliDeleteByIdsBody.name, OperationI<*>::toGoCliDeleteByIdsBody) - macros.registerMacro(OperationI<*>::toGoCliImportJsonBody.name, OperationI<*>::toGoCliImportJsonBody) - macros.registerMacro(OperationI<*>::toGoCliExportJsonBody.name, OperationI<*>::toGoCliExportJsonBody) - - macros.registerMacro(OperationI<*>::toGoFindByBody.name, OperationI<*>::toGoFindByBody) - macros.registerMacro(OperationI<*>::toGoCountByBody.name, OperationI<*>::toGoCountByBody) - macros.registerMacro(OperationI<*>::toGoExistByBody.name, OperationI<*>::toGoExistByBody) - - macros.registerMacro( - OperationI<*>::toGoStateCommandHandlerSetupBody.name, - OperationI<*>::toGoStateCommandHandlerSetupBody - ) - - macros.registerMacro( - OperationI<*>::toGoStateCommandHandlerAddCommandPreparerBody.name, - OperationI<*>::toGoStateCommandHandlerAddCommandPreparerBody - ) - - macros.registerMacro( - OperationI<*>::toGoStateAddCommandsPreparerBody.name, - OperationI<*>::toGoStateAddCommandsPreparerBody - ) - - macros.registerMacro( - OperationI<*>::toGoStateCommandHandlerExecuteBody.name, - OperationI<*>::toGoStateCommandHandlerExecuteBody - ) - - macros.registerMacro( - OperationI<*>::toGoStateEventType.name, - OperationI<*>::toGoStateEventType - ) - - macros.registerMacro( - OperationI<*>::toGoStateEventHandlersPreparerBody.name, - OperationI<*>::toGoStateEventHandlersPreparerBody - ) - - macros.registerMacro( - OperationI<*>::toGoStateEventHandlerApplyEvent.name, - OperationI<*>::toGoStateEventHandlerApplyEvent - ) - - macros.registerMacro( - OperationI<*>::toGoStateEventHandlerSetupBody.name, - OperationI<*>::toGoStateEventHandlerSetupBody - ) - - macros.registerMacro( - OperationI<*>::toGoStatesEventHandlerSetupBody.name, - OperationI<*>::toGoStatesEventHandlerSetupBody - ) - - macros.registerMacro( - OperationI<*>::toGoStatesEventHandlerApplyEvent.name, - OperationI<*>::toGoStatesEventHandlerApplyEvent - ) - - macros.registerMacro( - OperationI<*>::toGoAggregateHandleCommand.name, - OperationI<*>::toGoAggregateHandleCommand - ) - } -} diff --git a/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularGenerator.kt index d2f6a53..0dc1ed8 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/angular/DesignAngularGenerator.kt @@ -1,20 +1,24 @@ package ee.design.gen.angular -import ee.design.gen.DesignGeneratorFactory -import ee.lang.StructureUnitI -import ee.lang.gen.ts.prepareForTsGeneration +import ee.design.* +import ee.design.gen.ts.DesignTsContextFactory +import ee.design.gen.ts.DesignTsTemplates +import ee.design.gen.ts.DesignTypeScriptGenerator +import ee.lang.* +import ee.lang.gen.ts.* import java.nio.file.Path open class DesignAngularGenerator(val model: StructureUnitI<*>) { - fun generate(target: Path) { + companion object { + fun buildTsContextFactoryAngular() = DesignTsContextFactory(false) + } - val generatorFactory = DesignGeneratorFactory() - model.prepareForTsGeneration() + fun generate(target: Path) { - val generatorApiBase = generatorFactory.typeScriptApiBase("", model).generator - val generatorAngular = generatorFactory.angular("", model).generator - val generatorAngularTranslate = generatorFactory.angularTranslate("", model).generator + val generatorApiBase = DesignTypeScriptGenerator(model).typeScriptApiBase("", model).generator + val generatorAngular = angular("", model).generator + val generatorAngularTranslate = angularTranslate("", model).generator /*val generatorContextsComponent = generatorFactory.angularTypeScriptComponent("", model) val generatorComponent = generatorContextsComponent.generator @@ -40,4 +44,227 @@ open class DesignAngularGenerator(val model: StructureUnitI<*>) { generatorModule.generate(target, model) generatorHtmlAndScss.generate(target, model)*/ } + + open fun angular(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { + val angularTemplates = DesignAngularTemplates(itemNameAsTsFileName) + val tsTemplates = DesignTsTemplates(itemNameAsTsFileName) + val tsContextFactory = buildTsContextFactoryAngular() + + val components: StructureUnitI<*>.() -> List> = { + if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) + } + val modules: StructureUnitI<*>.() -> List> = { + if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) + } + + val commands: StructureUnitI<*>.() -> List> = { findDownByType(CommandI::class.java) } + val commandEnums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.parent() is ControllerI<*> && it.name().endsWith("CommandType") + } + } + + val events: StructureUnitI<*>.() -> List> = { findDownByType(EventI::class.java) } + val eventEnums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.parent() is ControllerI<*> && it.name().endsWith("EventType") + } + } + + val enums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.parent() is StructureUnitI<*> && it.derivedAsType().isEmpty() + }.sortedBy { it.name() } + } + + val values: StructureUnitI<*>.() -> List> = { + findDownByType(ValuesI::class.java).filter { it.derivedAsType().isEmpty() } + .sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val basics: StructureUnitI<*>.() -> List> = { + findDownByType(BasicI::class.java).filter { it.derivedAsType().isEmpty() } + .sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val entities: StructureUnitI<*>.() -> List> = { + findDownByType(EntityI::class.java).filter { it.derivedAsType().isEmpty() } + .sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val aggregateEntities: StructureUnitI<*>.() -> List> = { + findDownByType(EntityI::class.java).filter { + it.belongsToAggregate().derivedAsType().isEmpty() && it.belongsToAggregate().isNotEMPTY() } + .sortedBy { "${it.belongsToAggregate().javaClass.simpleName} ${name()}" }.map { it.belongsToAggregate() } + } + + val moduleGenerators = mutableListOf>>() + val generator = GeneratorGroup( + "Angular", + listOf(GeneratorGroupItems("AngularModules", items = modules, generators = moduleGenerators)) + ) + + // View Component for Modules + val moduleViewComponentContextBuilder = tsContextFactory.buildForImplOnly("/components/view") + moduleGenerators.add( + GeneratorItems("AngularModuleViewComponent", + contextBuilder = moduleViewComponentContextBuilder, items = modules, + + templates = { + listOf( + tsTemplates.moduleTypeScript(angularModuleViewComponent.ts), + angularTemplates.moduleHTML(angularModuleViewComponent.html), + angularTemplates.moduleSCSS(angularModuleViewComponent.scss), + ) }) + ) + + // Module & Routing Component for Modules + val moduleModulesContextBuilder = tsContextFactory.buildForImplOnly() + moduleGenerators.add( + GeneratorItems("AngularModules", + contextBuilder = moduleModulesContextBuilder, items = modules, + + templates = { + listOf( + angularTemplates.angularModule(angularModule.ts, components.invoke(model)), + angularTemplates.angularRoutingModule(angularRoutingModule.ts), + ) }) + ) + + // Module Service + val moduleServiceContextBuilder = tsContextFactory.buildForImplOnly("/service") + moduleGenerators.add( + GeneratorItems("AngularModulesService", + contextBuilder = moduleServiceContextBuilder, items = modules, + + templates = { + listOf( + tsTemplates.moduleService(modules.invoke(model), angularModuleService.ts) + ) }) + ) + + // View, List, Form, Service Components for Entities + val entityComponentContextBuilder = tsContextFactory.buildForImplOnly() + moduleGenerators.add( + GeneratorItems("AngularEntityComponent", + contextBuilder = entityComponentContextBuilder, items = entities, + + templates = { + listOf( + tsTemplates.entityViewTypeScript(angularEntityViewComponent.ts), + angularTemplates.entityViewHTML(entities.invoke(model), angularEntityViewComponent.html), + angularTemplates.entityViewSCSS(angularEntityViewComponent.scss), + + tsTemplates.entityFormTypeScript(angularEntityFormComponent.ts), + angularTemplates.entityFormHTML(angularEntityFormComponent.html), + angularTemplates.entityFormSCSS(angularEntityFormComponent.scss), + + tsTemplates.entityListTypeScript(angularEntityListComponent.ts), + angularTemplates.entityListHTML(angularEntityListComponent.html, aggregateEntities.invoke(model), entities.invoke(model)), + angularTemplates.entityListSCSS(angularEntityListComponent.scss), + + tsTemplates.entityDataService(entities.invoke(model), angularEntityService.ts) + ) }) + ) + + // View, List, Form Components for Aggregate Entity + val aggregateEntityComponentContextBuilder = tsContextFactory.buildForImplOnly() + moduleGenerators.add( + GeneratorItems("AngularAggregateEntityComponent", + contextBuilder = aggregateEntityComponentContextBuilder, items = aggregateEntities, + + templates = { + listOf( + tsTemplates.entityAggregateViewTypeScript(angularAggregateEntityComponent.ts), + angularTemplates.entityAggregateViewHTML(angularAggregateEntityComponent.html), + angularTemplates.entityAggregateViewSCSS(angularAggregateEntityComponent.scss), + ) }) + ) + + // View, List, Form, Service Components for Values + val valuesComponentContextBuilder = tsContextFactory.buildForImplOnly() + moduleGenerators.add( + GeneratorItems("AngularValuesComponent", + contextBuilder = valuesComponentContextBuilder, items = values, + + templates = { + listOf( + tsTemplates.valueViewTypeScript(angularEntityViewComponent.ts), + angularTemplates.entityViewHTML(entities.invoke(model), angularEntityViewComponent.html), + angularTemplates.entityViewSCSS(angularEntityViewComponent.scss), + + tsTemplates.valueFormTypeScript(angularEntityFormComponent.ts), + angularTemplates.entityFormHTML(angularEntityFormComponent.html), + angularTemplates.entityFormSCSS(angularEntityFormComponent.scss), + + tsTemplates.valueListTypeScript(angularEntityListComponent.ts), + angularTemplates.entityListHTML(angularEntityListComponent.html, aggregateEntities.invoke(model), entities.invoke(model)), + angularTemplates.entityListSCSS(angularEntityListComponent.scss), + + tsTemplates.entityDataService(entities.invoke(model), angularEntityService.ts) + ) }) + ) + + // Basics Components + val basicsContextBuilder = tsContextFactory.buildForImplOnly("/basics") + moduleGenerators.add( + GeneratorItems("AngularBasics", + contextBuilder = basicsContextBuilder, items = basics, + + templates = { + listOf( + tsTemplates.basicTypeScript(angularBasicComponent.ts), + angularTemplates.basicHTML(angularBasicComponent.html), + angularTemplates.basicSCSS(angularBasicComponent.scss), + ) }) + ) + + // Enums Components + val enumsContextBuilder = tsContextFactory.buildForImplOnly("/enums") + moduleGenerators.add( + GeneratorItems("AngularEnums", + contextBuilder = enumsContextBuilder, items = enums, + + templates = { + listOf( + tsTemplates.enumTypeScript(angularEnumComponent.ts), + angularTemplates.enumHTML(angularEnumComponent.html), + angularTemplates.enumSCSS(angularEnumComponent.scss), + ) }) + ) + + return GeneratorContexts(generator, moduleViewComponentContextBuilder, moduleModulesContextBuilder, moduleServiceContextBuilder, + entityComponentContextBuilder, aggregateEntityComponentContextBuilder, basicsContextBuilder, enumsContextBuilder,) + } + + open fun angularTranslate(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { + val tsTemplates = DesignTsTemplates(itemNameAsJsonFileName) + val tsContextFactory = buildTsContextFactoryAngular() + + val components: StructureUnitI<*>.() -> List> = { + if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) + } + + val moduleGenerators = mutableListOf>>() + val generator = GeneratorGroup( + "AngularTranslate", + listOf(GeneratorGroupItems("AngularTranslate", items = components, generators = moduleGenerators)) + ) + + val angularTranslateFileContextFactory = tsContextFactory.buildForImplOnly("/assets/i18n") + moduleGenerators.add( + GeneratorItems("AngularTranslate", + contextBuilder = angularTranslateFileContextFactory, items = components, + + templates = { + listOf( + tsTemplates.translateJson(english.json), + tsTemplates.translateJson(germany.json), + tsTemplates.translateJson(france.json), + tsTemplates.translateJson(spain.json), + ) }) + ) + + return GeneratorContexts(generator, angularTranslateFileContextFactory) + } } diff --git a/ee-design/src/main/kotlin/ee/design/gen/doc/DesignDocGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/doc/DesignDocGenerator.kt index 3c30230..15e4a0a 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/doc/DesignDocGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/doc/DesignDocGenerator.kt @@ -1,20 +1,57 @@ package ee.design.gen.doc -import ee.design.gen.DesignGeneratorFactory -import ee.lang.StructureUnitI +import ee.design.CompI +import ee.lang.* +import ee.lang.gen.doc.markdownClassDiagram import ee.lang.gen.doc.prepareForMarkdownGeneration +import ee.lang.gen.ts.itemNameAsTsFileName import java.nio.file.Path -open class DesignDocGenerator(val model: StructureUnitI<*>) { +open class DesignDocGenerator(val model: StructureUnitI<*>, private val targetAsSingleModule: Boolean = true) { + + fun buildDocContextFactory() = DesignDocContextFactory(targetAsSingleModule) + fun buildDocTemplates() = DesignDocTemplates(itemNameAsTsFileName) fun generate(target: Path) { - val generatorFactory = DesignGeneratorFactory() model.prepareForMarkdownGeneration() - val generatorClassDiagram = generatorFactory.docMarkDown("", model).generator + val generatorClassDiagram = docMarkDown("", model).generator generatorClassDiagram.delete(target, model) generatorClassDiagram.generate(target, model) } + + + open fun docMarkDown(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { + val docTemplates = buildDocTemplates() + val docContextFactory = buildDocContextFactory() + + val components: StructureUnitI<*>.() -> List> = { + if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) + } + + val compilationUnit: StructureUnitI<*>.() -> List> = { + if (this is CompilationUnitI<*>) listOf(this) else findDownByType(CompilationUnitI::class.java) + } + + val moduleGenerators = mutableListOf>>() + val generator = GeneratorGroup( + "doc", + listOf(GeneratorGroupItems("doc", items = components, generators = moduleGenerators)) + ) + + val docContextBuilder = docContextFactory.buildForImplOnly("") + moduleGenerators.add( + GeneratorItems("PlantUmlClassDiagram", + contextBuilder = docContextBuilder, items = components, + + templates = { + listOf( + docTemplates.generatePlantUmlClassDiagramComponent(markdownClassDiagram.puml) + ) }) + ) + + return GeneratorContexts(generator, docContextBuilder) + } } diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt index 7a83c72..1d7d8d5 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt @@ -1,15 +1,30 @@ package ee.design.gen.go import ee.design.* -import ee.design.gen.DesignGeneratorFactory +import ee.design.gen.swagger.DesignSwaggerContextFactory +import ee.design.gen.swagger.DesignSwaggerTemplates import ee.lang.* +import ee.lang.gen.common.LangCommonContextFactory import ee.lang.gen.go.initsForGoGeneration +import ee.lang.gen.go.itemAndTemplateNameAsGoFileName +import ee.lang.gen.go.itemNameAsGoFileName +import ee.lang.gen.swagger.itemNameAsSwaggerFileName import org.slf4j.LoggerFactory import java.nio.file.Path -open class DesignGoGenerator(private val models: List>, targetAsSingleModule: Boolean = true) { +open class DesignGoGenerator(private val models: List>, + private val targetAsSingleModule: Boolean = true) { private val log = LoggerFactory.getLogger(javaClass) - val generatorFactory = DesignGeneratorFactory(targetAsSingleModule) + + fun buildGoContextFactory() = DesignGoContextFactory(targetAsSingleModule) + + companion object { + fun buildGoTemplates() = DesignGoTemplates(itemNameAsGoFileName) + + + fun buildSwaggerContextFactory() = DesignSwaggerContextFactory() + fun buildSwaggerTemplates() = DesignSwaggerTemplates(itemNameAsSwaggerFileName) + } init { models.extendForGoGeneration() @@ -20,7 +35,7 @@ open class DesignGoGenerator(private val models: List>, target fun generate( target: Path, - generatorContexts: GeneratorContexts> = generatorFactory.go(), + generatorContexts: GeneratorContexts> = go(), shallSkip: GeneratorI<*>.(model: Any?) -> Boolean = { false }) { models.forEach { @@ -84,4 +99,519 @@ open class DesignGoGenerator(private val models: List>, target defineConstructorNoProps { constructors().isEmpty() && this !is CommandI<*> && this !is EventI<*> } } + + open fun go(fileNamePrefix: String = ""): GeneratorContexts> { + + val goTemplates = buildGoTemplates() + val contextFactory = buildGoContextFactory() + val goContextBuilderIfcOrImplOnly = contextFactory.buildForImplOnly() + val goContextBuilderIfcAndImpl = contextFactory.buildForIfcAndImpl() + + val components: StructureUnitI<*>.() -> List> = { + if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) + } + + val modules: StructureUnitI<*>.() -> List> = { + val ret = if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) + ret + } + + val enums: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(EnumTypeI::class.java).filter { + it.parent() is StructureUnitI<*> && it.derivedAsType().isEmpty() + }.sortedBy { it.name() } + ret + } + + val interfaces: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } + } + + val values: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(ValuesI::class.java).filter { + !it.isIfc() && it.derivedAsType().isEmpty() + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + ret + } + + val basics: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(BasicI::class.java).filter { + !it.isIfc() && it.derivedAsType().isEmpty() + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + ret + } + + val entities: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(EntityI::class.java).filter { + !it.isIfc() && it.derivedAsType().isEmpty() + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + ret + } + + val states: StructureUnitI<*>.() -> List> = { + findDownByType(StateI::class.java).filter { + !it.isIfc() && it.derivedAsType().isEmpty() + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val controllersWithOutOps: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(ControllerI::class.java).filter { + !it.isIfc() && it.derivedAsType().isEmpty() && it.operations().isEmpty() + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + ret + } + + val controllersWithOps: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(ControllerI::class.java).filter { + !it.isIfc() && it.derivedAsType().isEmpty() && it.operations().isNotEmpty() + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + ret + } + + registerGoMacros(contextFactory) + + val moduleGenerators = mutableListOf>>() + val generator = GeneratorGroup( + "go", listOf( + GeneratorGroupItems( + "modulesGenerators", + items = modules, generators = moduleGenerators + ) + ) + ) + + moduleGenerators.addAll( + listOf( + GeneratorSimple( + "ifc_base", contextBuilder = goContextBuilderIfcOrImplOnly, + template = FragmentsTemplate(name = "${fileNamePrefix}ifc_base", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(goTemplates.ifc()) + })) + }) + ), + GeneratorSimple( + "_api_base", contextBuilder = goContextBuilderIfcOrImplOnly, + template = FragmentsTemplate(name = "${fileNamePrefix}api_base", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf( + ItemsFragment(items = entities, fragments = { listOf(goTemplates.entity()) }), + ItemsFragment, CompilationUnitI<*>>(items = values, + fragments = { listOf(goTemplates.pojo()) }), + ItemsFragment, CompilationUnitI<*>>(items = basics, + fragments = { listOf(goTemplates.pojo()) }), + ItemsFragment(items = enums, fragments = { listOf(goTemplates.enum()) }), + ItemsFragment(items = controllersWithOutOps, fragments = { listOf(goTemplates.pojo()) }) + ) + }) + ), + GeneratorSimple( + "ifc_api_base", contextBuilder = goContextBuilderIfcAndImpl, + template = FragmentsTemplate(name = "${fileNamePrefix}ifc_api_base", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf( + ItemsFragment(items = controllersWithOps, fragments = { + listOf(goTemplates.ifc()) + }), + ItemsFragment(items = controllersWithOps, fragments = { + listOf(goTemplates.pojo()) + }) + ) + }) + ), + GeneratorSimple( + "_test_base", contextBuilder = goContextBuilderIfcOrImplOnly, + template = FragmentsTemplate(name = "${fileNamePrefix}test_base", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf( + ItemsFragment(items = entities, fragments = { listOf(goTemplates.newTestInstance()) }), + ItemsFragment, CompilationUnitI<*>>(items = values, + fragments = { listOf(goTemplates.newTestInstance()) }), + ItemsFragment, CompilationUnitI<*>>(items = basics, + fragments = { listOf(goTemplates.newTestInstance()) }) + ) + }) + ) + ) + ) + + //val derivedTypes = mutableListOf(DesignDerivedType.Aggregate, DesignDerivedType.Query, DesignDerivedType.Http, + // DesignDerivedType.Client, DesignDerivedType.Cli, DesignDerivedType.StateMachine) + val derivedTypes: List = emptyList() + val derivedTypesGenerators = derivedTypes.map { derivedType -> + GeneratorSimple( + "${derivedType}_base", contextBuilder = goContextBuilderIfcOrImplOnly, + template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}_base", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf( + ItemsFragment(items = { + findDownByType(ControllerI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + }, fragments = { listOf(goTemplates.ifcOrPojo()) }), + ItemsFragment(items = { + findDownByType(ValuesI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + }, fragments = { listOf(goTemplates.ifcOrPojo()) }), + ItemsFragment(items = { + findDownByType(BasicI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + }, fragments = { listOf(goTemplates.ifcOrPojo()) }), + ItemsFragment(items = { + findDownByType(EnumTypeI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + }, fragments = { listOf(goTemplates.enum()) }) + ) + }) + ) + } + moduleGenerators.addAll(derivedTypesGenerators) + + return GeneratorContexts(generator, goContextBuilderIfcOrImplOnly) + } + + open fun goEventDriven(fileNamePrefix: String = ""): GeneratorContexts> { + + val swaggerTemplates = buildSwaggerTemplates() + val swaggerContextFactory = buildSwaggerContextFactory() + val swaggerContextBuilder = swaggerContextFactory.build() + + val goTemplates = buildGoTemplates() + val contextFactory = buildGoContextFactory() + val goContextBuilder = contextFactory.buildForImplOnly() + + val components: StructureUnitI<*>.() -> List> = { + if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) + } + + val modules: StructureUnitI<*>.() -> List> = { + if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) + } + + registerGoMacros(contextFactory) + + val moduleGenerators = mutableListOf>>() + val generator = GeneratorGroup( + "eventDrivenGo", listOf( + GeneratorGroupItems( + "modulesGenerators", + items = modules, generators = moduleGenerators + ), + GeneratorItems("swaggerComponent", contextBuilder = swaggerContextBuilder, items = components, + templates = { listOf(swaggerTemplates.model()) }) + ) + ) + + moduleGenerators.addAll( + listOf( + + ) + ) + + val derivedTypes = mutableListOf( + "", + DesignDerivedType.Aggregate, + DesignDerivedType.AggregateEvents, + DesignDerivedType.AggregateCommands, + DesignDerivedType.Query, + DesignDerivedType.Http, + DesignDerivedType.Client, + DesignDerivedType.Cli, + DesignDerivedType.StateMachine, + DesignDerivedType.StateMachineEvents, + DesignDerivedType.StateMachineCommands, + ) + + derivedTypes.forEach { derivedType -> + + val controllers: StructureUnitI<*>.() -> Collection> = { + findDownByType(type = ControllerI::class.java, stopSteppingDownIfFound = false).filter { + !it.isIfc() && it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val commands: StructureUnitI<*>.() -> List> = { + findDownByType(CommandI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val eventsWithData: StructureUnitI<*>.() -> List> = { + findDownByType(EventI::class.java).filter { + it.props().isNotEmpty() && it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val enums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { it.name() } + } + + val interfaces: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java, stopSteppingDownIfFound = false).filter { + it.isIfc() && it.derivedAsType().equals(derivedType, true) + }.sortedBy { it.name() } + } + + val values: StructureUnitI<*>.() -> List> = { + findDownByType(ValuesI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val basics: StructureUnitI<*>.() -> List> = { + findDownByType(BasicI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val entities: StructureUnitI<*>.() -> List> = { + val retEntities = findDownByType(EntityI::class.java).filter { + it.derivedAsType().equals(derivedType, true) + }.sortedBy { "${it.javaClass.simpleName} ${name()}" } + retEntities.forEach { + it.propIdOrAdd() + it.propDeletedAt() + } + retEntities + } + + moduleGenerators.add( + GeneratorSimple( + "IfcBase", contextBuilder = goContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}IfcBase", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(goTemplates.ifc()) + })) + }) + ) + ) + moduleGenerators.add( + GeneratorSimple( + "ApiBase", contextBuilder = goContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}ApiBase", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf( + ItemsFragment(items = entities, fragments = { listOf(goTemplates.entity()) }), + ItemsFragment(items = controllers, fragments = { listOf(goTemplates.pojo()) }), + ItemsFragment, CompilationUnitI<*>>(items = values, + fragments = { listOf(goTemplates.pojo()) }), + ItemsFragment, CompilationUnitI<*>>(items = basics, + fragments = { listOf(goTemplates.pojo()) }), + ItemsFragment(items = enums, fragments = { listOf(goTemplates.enum()) }) + ) + }) + ) + ) + + moduleGenerators.add( + GeneratorSimple( + "TestBase", contextBuilder = goContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}TestBase", + nameBuilder = itemAndTemplateNameAsGoFileName, + fragments = { + listOf( + ItemsFragment(items = entities, + fragments = { listOf(goTemplates.newTestInstance()) }), + ItemsFragment, CompilationUnitI<*>>(items = values, + fragments = { listOf(goTemplates.newTestInstance()) }), + ItemsFragment, CompilationUnitI<*>>(items = basics, + fragments = { listOf(goTemplates.newTestInstance()) }) + ) + }) + ) + ) + moduleGenerators.add( + GeneratorSimple( + "CommandsBase", contextBuilder = goContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}EsCommandsBase", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf( + ItemsFragment(items = entities, fragments = { listOf(goTemplates.commandTypes()) }), + ItemsFragment(items = commands, fragments = { listOf(goTemplates.command()) }), + ) + }) + ) + ) + moduleGenerators.add( + GeneratorSimple( + "EventsBase", contextBuilder = goContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}${derivedType}EsEventsBase", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf( + ItemsFragment(items = entities, fragments = { listOf(goTemplates.eventTypes()) }), + ItemsFragment( + items = eventsWithData, + fragments = { listOf(goTemplates.pojoExcludePropsWithValue()) }), + ) + }) + ) + ) + } + + return GeneratorContexts(generator, swaggerContextBuilder, goContextBuilder) + } + + protected fun registerGoMacros(contextFactory: LangCommonContextFactory) { + val macros = contextFactory.macroController + macros.registerMacro( + OperationI<*>::toGoAggregateEngineRegisterCommands.name, + OperationI<*>::toGoAggregateEngineRegisterCommands + ) + macros.registerMacro( + CompilationUnitI<*>::toGoAggregateEngineConst.name, + CompilationUnitI<*>::toGoAggregateEngineConst + ) + macros.registerMacro( + CompilationUnitI<*>::toGoAggregateEngineRegisterForEvents.name, + CompilationUnitI<*>::toGoAggregateEngineRegisterForEvents + ) + + macros.registerMacro( + ConstructorI<*>::toGoAggregateEngineBody.name, + ConstructorI<*>::toGoAggregateEngineBody + ) + + macros.registerMacro( + OperationI<*>::toGoAggregateEngineSetupBody.name, + OperationI<*>::toGoAggregateEngineSetupBody + ) + + macros.registerMacro( + OperationI<*>::toGoAggregateApplyEventBody.name, + OperationI<*>::toGoAggregateApplyEventBody + ) + + macros.registerMacro(ConstructorI<*>::toGoEhEngineBody.name, ConstructorI<*>::toGoEhEngineBody) + macros.registerMacro(OperationI<*>::toGoEhEngineSetupBody.name, OperationI<*>::toGoEhEngineSetupBody) + macros.registerMacro(AttributeI<*>::toGoPropOptionalAfterBody.name, AttributeI<*>::toGoPropOptionalAfterBody) + + macros.registerMacro( + OperationI<*>::toGoStatesCommandHandlerSetupBody.name, + OperationI<*>::toGoStatesCommandHandlerSetupBody + ) + macros.registerMacro( + OperationI<*>::toGoStatesCommandHandlerExecute.name, + OperationI<*>::toGoStatesCommandHandlerExecute + ) + + macros.registerMacro(OperationI<*>::toGoEventHandlerApplyEvent.name, OperationI<*>::toGoEventHandlerApplyEvent) + macros.registerMacro(OperationI<*>::toGoEventHandlerSetupBody.name, OperationI<*>::toGoEventHandlerSetupBody) + macros.registerMacro(OperationI<*>::toGoHttpHandlerBody.name, OperationI<*>::toGoHttpHandlerBody) + macros.registerMacro(OperationI<*>::toGoHttpHandlerIdBasedBody.name, OperationI<*>::toGoHttpHandlerIdBasedBody) + macros.registerMacro(OperationI<*>::toGoHttpHandlerCommandBody.name, OperationI<*>::toGoHttpHandlerCommandBody) + macros.registerMacro(OperationI<*>::toGoSetupHttpRouterBody.name, OperationI<*>::toGoSetupHttpRouterBody) + macros.registerMacro(ConstructorI<*>::toGoHttpRouterBeforeBody.name, ConstructorI<*>::toGoHttpRouterBeforeBody) + macros.registerMacro( + ConstructorI<*>::toGoHttpModuleRouterBeforeBody.name, + ConstructorI<*>::toGoHttpModuleRouterBeforeBody + ) + macros.registerMacro(OperationI<*>::toGoSetupModuleHttpRouter.name, OperationI<*>::toGoSetupModuleHttpRouter) + + macros.registerMacro(OperationI<*>::toGoHttpClientCreateBody.name, OperationI<*>::toGoHttpClientCreateBody) + macros.registerMacro( + OperationI<*>::toGoHttpClientCreateItemsBody.name, + OperationI<*>::toGoHttpClientCreateItemsBody + ) + macros.registerMacro( + OperationI<*>::toGoHttpClientDeleteByIdsBody.name, + OperationI<*>::toGoHttpClientDeleteByIdsBody + ) + macros.registerMacro( + OperationI<*>::toGoHttpClientDeleteByIdBody.name, + OperationI<*>::toGoHttpClientDeleteByIdBody + ) + macros.registerMacro(OperationI<*>::toGoHttpClientFindAllBody.name, OperationI<*>::toGoHttpClientFindAllBody) + macros.registerMacro( + OperationI<*>::toGoHttpClientImportJsonBody.name, + OperationI<*>::toGoHttpClientImportJsonBody + ) + macros.registerMacro( + OperationI<*>::toGoHttpClientExportJsonBody.name, + OperationI<*>::toGoHttpClientExportJsonBody + ) + + macros.registerMacro( + OperationI<*>::toGoHttpClientReadFileJsonBody.name, + OperationI<*>::toGoHttpClientReadFileJsonBody + ) + macros.registerMacro(ConstructorI<*>::toGoHttpClientBeforeBody.name, ConstructorI<*>::toGoHttpClientBeforeBody) + macros.registerMacro( + ConstructorI<*>::toGoHttpModuleClientBeforeBody.name, + ConstructorI<*>::toGoHttpModuleClientBeforeBody + ) + + macros.registerMacro(ConstructorI<*>::toGoCliBeforeBody.name, ConstructorI<*>::toGoCliBeforeBody) + + macros.registerMacro(OperationI<*>::toGoCliBuildCommands.name, OperationI<*>::toGoCliBuildCommands) + macros.registerMacro(OperationI<*>::toGoCliDeleteByIdBody.name, OperationI<*>::toGoCliDeleteByIdBody) + macros.registerMacro(OperationI<*>::toGoCliDeleteByIdsBody.name, OperationI<*>::toGoCliDeleteByIdsBody) + macros.registerMacro(OperationI<*>::toGoCliImportJsonBody.name, OperationI<*>::toGoCliImportJsonBody) + macros.registerMacro(OperationI<*>::toGoCliExportJsonBody.name, OperationI<*>::toGoCliExportJsonBody) + + macros.registerMacro(OperationI<*>::toGoFindByBody.name, OperationI<*>::toGoFindByBody) + macros.registerMacro(OperationI<*>::toGoCountByBody.name, OperationI<*>::toGoCountByBody) + macros.registerMacro(OperationI<*>::toGoExistByBody.name, OperationI<*>::toGoExistByBody) + + macros.registerMacro( + OperationI<*>::toGoStateCommandHandlerSetupBody.name, + OperationI<*>::toGoStateCommandHandlerSetupBody + ) + + macros.registerMacro( + OperationI<*>::toGoStateCommandHandlerAddCommandPreparerBody.name, + OperationI<*>::toGoStateCommandHandlerAddCommandPreparerBody + ) + + macros.registerMacro( + OperationI<*>::toGoStateAddCommandsPreparerBody.name, + OperationI<*>::toGoStateAddCommandsPreparerBody + ) + + macros.registerMacro( + OperationI<*>::toGoStateCommandHandlerExecuteBody.name, + OperationI<*>::toGoStateCommandHandlerExecuteBody + ) + + macros.registerMacro( + OperationI<*>::toGoStateEventType.name, + OperationI<*>::toGoStateEventType + ) + + macros.registerMacro( + OperationI<*>::toGoStateEventHandlersPreparerBody.name, + OperationI<*>::toGoStateEventHandlersPreparerBody + ) + + macros.registerMacro( + OperationI<*>::toGoStateEventHandlerApplyEvent.name, + OperationI<*>::toGoStateEventHandlerApplyEvent + ) + + macros.registerMacro( + OperationI<*>::toGoStateEventHandlerSetupBody.name, + OperationI<*>::toGoStateEventHandlerSetupBody + ) + + macros.registerMacro( + OperationI<*>::toGoStatesEventHandlerSetupBody.name, + OperationI<*>::toGoStatesEventHandlerSetupBody + ) + + macros.registerMacro( + OperationI<*>::toGoStatesEventHandlerApplyEvent.name, + OperationI<*>::toGoStatesEventHandlerApplyEvent + ) + + macros.registerMacro( + OperationI<*>::toGoAggregateHandleCommand.name, + OperationI<*>::toGoAggregateHandleCommand + ) + } } \ No newline at end of file diff --git a/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt index e13480d..c01b50f 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt @@ -1,23 +1,22 @@ package ee.design.gen.kt import ee.design.ModuleI -import ee.design.gen.DesignGeneratorFactory import ee.design.renameControllersAccordingParentType import ee.design.markReplaceableConfigProps import ee.lang.* +import ee.lang.gen.kt.LangKotlinGenerator import ee.lang.gen.kt.prepareForKotlinGeneration import org.slf4j.LoggerFactory import java.nio.file.Path -open class DesignKotlinGenerator(val model: StructureUnitI<*>, targetAsSingleModule: Boolean = false) { +open class DesignKotlinGenerator(model: StructureUnitI<*>, targetAsSingleModule: Boolean = false): LangKotlinGenerator(model, targetAsSingleModule) { private val log = LoggerFactory.getLogger(javaClass) - val generatorFactory = DesignGeneratorFactory(targetAsSingleModule) init { model.extendForKotlinGeneration() } - fun generate(target: Path, generatorContexts: GeneratorContexts> = generatorFactory.pojoKt(), + fun generate(target: Path, generatorContexts: GeneratorContexts> = pojoKt(), shallSkip: GeneratorI<*>.(model: Any?) -> Boolean = { false }) { val generator = generatorContexts.generator log.info("generate ${generator.names()} to $target for ${model.name()}") diff --git a/ee-design/src/main/kotlin/ee/design/gen/ts/DesignTypeScriptGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/ts/DesignTypeScriptGenerator.kt index 44bbc2f..faf22ab 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/ts/DesignTypeScriptGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/ts/DesignTypeScriptGenerator.kt @@ -1,18 +1,20 @@ package ee.design.gen.ts -import ee.design.addIdPropToEntities -import ee.design.gen.DesignGeneratorFactory -import ee.lang.StructureUnitI +import ee.design.* +import ee.lang.* import ee.lang.gen.ts.initsForTsGeneration +import ee.lang.gen.ts.itemAndTemplateNameAsTsFileName +import ee.lang.gen.ts.itemNameAsTsFileName import java.nio.file.Path open class DesignTypeScriptGenerator(val model: StructureUnitI<*>) { + fun buildTsContextFactory() = DesignTsContextFactory(false) + fun buildTsTemplates() = DesignTsTemplates(itemNameAsTsFileName) fun generate(target: Path) { model.extendForTsGeneration() - val generatorFactory = DesignGeneratorFactory() - val generatorContextsApiBase = generatorFactory.typeScriptApiBase("", model) + val generatorContextsApiBase = typeScriptApiBase("", model) val generatorApiBase = generatorContextsApiBase.generator generatorApiBase.delete(target, model) @@ -38,4 +40,80 @@ open class DesignTypeScriptGenerator(val model: StructureUnitI<*>) { //extendForGoGenerationLang() } + + open fun typeScriptApiBase(fileNamePrefix: String = "", model: StructureUnitI<*>): GeneratorContexts> { + val tsTemplates = buildTsTemplates() + val tsContextFactory = buildTsContextFactory() + val tsContextBuilder = tsContextFactory.buildForImplOnly() + + val components: StructureUnitI<*>.() -> List> = { + if (this is CompI<*>) listOf(this) else findDownByType(CompI::class.java) + } + val modules: StructureUnitI<*>.() -> List> = { + if (this is ModuleI<*>) listOf(this) else findDownByType(ModuleI::class.java) + } + + val commands: StructureUnitI<*>.() -> List> = { findDownByType(CommandI::class.java) } + val commandEnums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.parent() is ControllerI<*> && it.name().endsWith("CommandType") + } + } + + val events: StructureUnitI<*>.() -> List> = { findDownByType(EventI::class.java) } + val eventEnums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.parent() is ControllerI<*> && it.name().endsWith("EventType") + } + } + + val enums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.parent() is StructureUnitI<*> && it.derivedAsType().isEmpty() + }.sortedBy { it.name() } + } + + val values: StructureUnitI<*>.() -> List> = { + findDownByType(ValuesI::class.java).filter { it.derivedAsType().isEmpty() } + .sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val basics: StructureUnitI<*>.() -> List> = { + findDownByType(BasicI::class.java).filter { it.derivedAsType().isEmpty() } + .sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val entities: StructureUnitI<*>.() -> List> = { + findDownByType(EntityI::class.java).filter { it.derivedAsType().isEmpty() } + .sortedBy { "${it.javaClass.simpleName} ${name()}" } + } + + val moduleGenerators = mutableListOf>>() + val generator = GeneratorGroup( + "angular", + listOf(GeneratorGroupItems("angularModules", items = modules, generators = moduleGenerators)) + ) + + moduleGenerators.addAll( + listOf( + GeneratorSimple( + "ApiBase", contextBuilder = tsContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", + nameBuilder = itemAndTemplateNameAsTsFileName, fragments = { + listOf( + ItemsFragment, CompilationUnitI<*>>(items = entities, + fragments = { listOf(tsTemplates.pojo()) }), + ItemsFragment, CompilationUnitI<*>>(items = values, + fragments = { listOf(tsTemplates.pojo()) }), + ItemsFragment, CompilationUnitI<*>>(items = basics, + fragments = { listOf(tsTemplates.pojo()) }), + ItemsFragment(items = enums, fragments = { listOf(tsTemplates.enum()) }) + ) + }) + ), + ) + ) + + return GeneratorContexts(generator, tsContextBuilder) + } } diff --git a/ee-design_gen/src/main/kotlin/ee/design/DesignGenerator.kt b/ee-design_gen/src/main/kotlin/ee/design/DesignGenerator.kt index 78b2100..3fac845 100644 --- a/ee-design_gen/src/main/kotlin/ee/design/DesignGenerator.kt +++ b/ee-design_gen/src/main/kotlin/ee/design/DesignGenerator.kt @@ -1,6 +1,6 @@ package ee.design -import ee.lang.gen.LangGeneratorFactory +import ee.lang.gen.kt.LangKotlinGenerator import ee.lang.gen.kt.prepareForKotlinGeneration import ee.lang.integ.eePath import java.nio.file.Path @@ -11,7 +11,7 @@ fun main() { fun generate(target: Path) { var model = d.prepareForKotlinGeneration() - val generatorFactory = LangGeneratorFactory() + val generatorFactory = LangKotlinGenerator(model) val generatorContexts = generatorFactory.dslKt("Design") generatorContexts.generator.delete(target, model) generatorContexts.generator.generate(target, model) diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/LangGeneratorFactory.kt b/ee-lang/src/main/kotlin/ee/lang/gen/LangGeneratorFactory.kt deleted file mode 100644 index 8b4a55f..0000000 --- a/ee-lang/src/main/kotlin/ee/lang/gen/LangGeneratorFactory.kt +++ /dev/null @@ -1,377 +0,0 @@ -package ee.lang.gen - -import ee.lang.* -import ee.lang.gen.common.LangCommonContextFactory -import ee.lang.gen.doc.LangMarkdownContextFactory -import ee.lang.gen.doc.LangMarkdownTemplates -import ee.lang.gen.doc.itemNameAsMarkdownFileName -import ee.lang.gen.doc.templateNameAsMarkdownFileName -import ee.lang.gen.go.LangGoContextFactory -import ee.lang.gen.go.LangGoTemplates -import ee.lang.gen.go.itemAndTemplateNameAsGoFileName -import ee.lang.gen.go.itemNameAsGoFileName -import ee.lang.gen.kt.LangKotlinContextFactory -import ee.lang.gen.kt.LangKotlinTemplates -import ee.lang.gen.kt.toKotlinInstanceDotEMPTY -import ee.lang.gen.kt.toKotlinInstanceEMPTY -import ee.lang.gen.puml.classdiagram.LangCdContextFactory -import ee.lang.gen.puml.classdiagram.LangCdTemplates -import ee.lang.gen.ts.LangTsContextFactory -import ee.lang.gen.ts.LangTsTemplates - -open class LangGeneratorFactory(protected val targetAsSingleModule: Boolean = true) { - - open fun devDoc(fileNamePrefix: String = ""): GeneratorContexts> { - val docTemplates = buildDocTemplates() - val docContextFactory = buildDocContextFactory() - val docContextBuilder = docContextFactory.build() - - val compilationUnits: StructureUnitI<*>.() -> List> = - { items().filterIsInstance(CompilationUnitI::class.java) } - - val generator = GeneratorGroup("documentation", listOf( - GeneratorSimple("DevDocBase", contextBuilder = docContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}DevDocBase", - nameBuilder = itemNameAsMarkdownFileName, - items = compilationUnits, fragments = { listOf(docTemplates.pojoImpl()) })), - GeneratorSimple("DevPlainUmlBase", contextBuilder = docContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}DevPlainUmlBase", - nameBuilder = templateNameAsMarkdownFileName, - items = compilationUnits, fragments = { listOf(docTemplates.pojoPlainImplWithComments()) })), - - GeneratorSimple("DevPlainUmlsuper", contextBuilder = docContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}DevPlainUmlsuper", - nameBuilder = templateNameAsMarkdownFileName, - items = compilationUnits, fragments = { listOf(docTemplates.pojoPlainSuperClass()) })), - - - GeneratorSimple("DevPlainUmlClass", contextBuilder = docContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}DevPlainUmlClass", - nameBuilder = templateNameAsMarkdownFileName, - items = compilationUnits, fragments = { listOf(docTemplates.pojoPlainImplClass()) })))) - return GeneratorContexts(generator, docContextBuilder) - } - - open fun dslKt(fileNamePrefix: String = ""): GeneratorContexts> { - val ktTemplates = buildKotlinTemplates() - val ktContextFactory = buildKotlinContextFactory() - val ktContextBuilder = ktContextFactory.buildForDslBuilder() - - val compilationUnits: StructureUnitI<*>.() -> List> = - { items().filterIsInstance(CompilationUnitI::class.java) } - - val generator = GeneratorGroup("dslKt", listOf( - GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}IfcBase", nameBuilder = templateNameAsKotlinFileName, - items = compilationUnits, fragments = { listOf(ktTemplates.dslBuilderI()) })), - GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}ApiBase", nameBuilder = templateNameAsKotlinFileName, - items = compilationUnits, fragments = { listOf(ktTemplates.dslBuilder()) })))) - return GeneratorContexts(generator, ktContextBuilder) - } - - open fun pojoKt(fileNamePrefix: String = ""): GeneratorContexts> { - val ktTemplates = buildKotlinTemplates() - val ktContextFactory = buildKotlinContextFactory() - val ktContextBuilder = ktContextFactory.buildForImplOnly() - val ktContextBuilderTest = ktContextFactory.buildForImplOnly("test") - - val enums: StructureUnitI<*>.() -> List> = { findDownByType(EnumTypeI::class.java) } - val compilationUnits: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } - } - val interfaces: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } - } - - val generator = GeneratorGroup("pojoKt", listOf( - GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(ktTemplates.ifc(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = enums, - fragments = { listOf(ktTemplates.enum()) }), - ItemsFragment(items = compilationUnits, fragments = { - listOf(ktTemplates.pojo(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("IfcEmpty", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcEmpty", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(ktTemplates.ifcEmpty(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("ApiTestEnumsBase", contextBuilder = ktContextBuilderTest, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestEnumsBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = enums, - fragments = { - listOf(ktTemplates.enumParseAndIsMethodsTestsParseMethodTests()) - })) - })), - GeneratorSimple("ApiTestBase", contextBuilder = ktContextBuilderTest, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = compilationUnits, - fragments = { - listOf(ktTemplates.pojoTest()) - })) - })))) - return GeneratorContexts(generator, ktContextBuilder) - } - - open fun pojoAndBuildersKt(fileNamePrefix: String = ""): GeneratorContexts> { - val ktTemplates = buildKotlinTemplates() - val ktContextFactory = buildKotlinContextFactory() - val ktContextBuilder = ktContextFactory.buildForImplOnly() - val ktContextBuilderTest = ktContextFactory.buildForImplOnly("test") - - val enums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java) - } - val compilationUnits: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } - } - val interfaces: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } - } - val interfacesNonBlock: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { type -> - type.isIfc() && (type.isNonBlock() || type.operations().find { - it.isNonBlock().notNullValueElse(type.isNonBlock()) - } != null) - } - } - val dataTypes: StructureUnitI<*>.() -> List> = { - findDownByType(DataTypeI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } - } - - registerKtMacros(ktContextFactory) - - val generator = GeneratorGroup("pojoAndBuildersKt", listOf( - GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(ktTemplates.ifc(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("IfcBlockingBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfacesNonBlock, fragments = { - listOf(ktTemplates.ifcBlocking(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("IfcEmpty", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcEmpty", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(ktTemplates.ifcEmpty(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("IfcBlockingEmpty", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingEmpty", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfacesNonBlock, fragments = { - listOf(ktTemplates.emptyBlocking(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("BlockingWrapper", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}BlockingWrapper", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfacesNonBlock, fragments = { - listOf(ktTemplates.blockingWrapper(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = enums, - fragments = { listOf(ktTemplates.enum()) }), - ItemsFragment(items = compilationUnits, fragments = { - listOf(ktTemplates.pojo(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("BuilderIfcBase", contextBuilder = ktContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}BuilderIfcBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, - items = dataTypes, fragments = { listOf(ktTemplates.builderI(itemNameAsKotlinFileName)) })), - GeneratorSimple("BuilderApiBase", contextBuilder = ktContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}BuilderApiBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, - items = dataTypes, fragments = { listOf(ktTemplates.builder(itemNameAsKotlinFileName)) })), - GeneratorSimple("ApiTestEnumsBase", contextBuilder = ktContextBuilderTest, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestEnumsBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = enums, - fragments = { - listOf(ktTemplates.enumParseAndIsMethodsTestsParseMethodTests()) - })) - })), - GeneratorSimple("ApiTestBase", contextBuilder = ktContextBuilderTest, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = compilationUnits, - fragments = { - listOf(ktTemplates.pojoTest()) - })) - })) - )) - return GeneratorContexts(generator, ktContextBuilder, ktContextBuilderTest) - } - - open fun fx(fileNamePrefix: String = ""): GeneratorContexts> { - val ktTemplates = buildKotlinTemplates() - val ktContextFactory = buildKotlinContextFactory() - val ktContextBuilder = ktContextFactory.buildForImplOnly() - val ktContextBuilderTest = ktContextFactory.buildForImplOnly("test") - - val enums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java) - } - val compilationUnits: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } - } - val interfaces: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } - } - val interfacesNonBlock: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it.isIfc() && it.isNonBlock() } - } - val dataTypes: StructureUnitI<*>.() -> List> = { - findDownByType(DataTypeI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } - } - - val generator = GeneratorGroup("pojoAndBuildersKt", listOf( - GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(ktTemplates.ifc(itemNameAsGoFileName)) - })) - })), - GeneratorSimple("IfcBlockingBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfacesNonBlock, fragments = { - listOf(ktTemplates.ifcBlocking(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("IfcEmpty", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcEmpty", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfaces, fragments = { - listOf(ktTemplates.ifcEmpty(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("IfcBlockingEmpty", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingEmpty", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfacesNonBlock, fragments = { - listOf(ktTemplates.emptyBlocking(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("BlockingWrapper", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}BlockingWrapper", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = interfacesNonBlock, fragments = { - listOf(ktTemplates.blockingWrapper(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = enums, - fragments = { listOf(ktTemplates.enum()) }), - ItemsFragment(items = compilationUnits, fragments = { - listOf(ktTemplates.pojo(itemNameAsKotlinFileName)) - })) - })), - GeneratorSimple("BuilderIfcBase", contextBuilder = ktContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}BuilderIfcBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, - items = dataTypes, fragments = { listOf(ktTemplates.builderI(itemNameAsKotlinFileName)) })), - GeneratorSimple("BuilderApiBase", contextBuilder = ktContextBuilder, - template = ItemsTemplate(name = "${fileNamePrefix}BuilderApiBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, - items = dataTypes, fragments = { listOf(ktTemplates.builder(itemNameAsKotlinFileName)) })), - GeneratorSimple("ApiTestEnumsBase", contextBuilder = ktContextBuilderTest, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestEnumsBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = enums, - fragments = { - listOf(ktTemplates.enumParseAndIsMethodsTestsParseMethodTests()) - })) - })), - GeneratorSimple("ApiTestBase", contextBuilder = ktContextBuilderTest, - template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestBase", - nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { - listOf(ItemsFragment(items = compilationUnits, - fragments = { - listOf(ktTemplates.pojoTest()) - })) - })) - )) - return GeneratorContexts(generator, ktContextBuilder, ktContextBuilderTest) - } - - open fun pojoGo(fileNamePrefix: String = ""): GeneratorContexts> { - val goTemplates = buildGoTemplates() - val goContextFactory = buildGoContextFactory() - val goContextBuilder = goContextFactory.buildForImplOnly() - - val enums: StructureUnitI<*>.() -> List> = { - findDownByType(EnumTypeI::class.java).filter { - it.parent() is StructureUnitI<*> || it.derivedAsType().isNotEmpty() - } - } - val compilationUnits: StructureUnitI<*>.() -> List> = { - findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> } - } - - val generator = GeneratorGroup("pojoGo", listOf(GeneratorSimple("ApiBase", - contextBuilder = goContextBuilder, template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", - nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { - listOf(ItemsFragment(items = enums, fragments = { listOf(goTemplates.enum()) }), - ItemsFragment(items = compilationUnits, fragments = { listOf(goTemplates.pojo()) })) - })))) - return GeneratorContexts(generator, goContextBuilder) - } - - protected open fun buildKotlinContextFactory() = LangKotlinContextFactory(targetAsSingleModule) - protected open fun buildKotlinTemplates() = LangKotlinTemplates(itemNameAsKotlinFileName) - - protected open fun buildGoContextFactory() = LangGoContextFactory(targetAsSingleModule) - protected open fun buildGoTemplates() = LangGoTemplates(itemNameAsGoFileName) - - protected open fun buildTsContextFactory() = LangTsContextFactory() - protected open fun buildTsTemplates() = LangTsTemplates() - - protected open fun buildCdContextFactory() = LangCdContextFactory() - protected open fun buildCdTemplates() = LangCdTemplates() - - protected open fun buildSwaggerContextFactory() = LangCommonContextFactory() - - protected open fun buildDocContextFactory() = LangMarkdownContextFactory(targetAsSingleModule) - protected open fun buildDocTemplates() = LangMarkdownTemplates(itemNameAsMarkdownFileName) - - - protected fun registerKtMacros(contextFactory: LangCommonContextFactory) { - val macros = contextFactory.macroController - macros.registerMacro(TypeI<*>::toKotlinInstanceEMPTY.name, TypeI<*>::toKotlinInstanceEMPTY) - macros.registerMacro(TypeI<*>::toKotlinInstanceDotEMPTY.name, TypeI<*>::toKotlinInstanceDotEMPTY) - } - - companion object { - const val CONTEXT_KOTLIN = "kotlin" - const val CONTEXT_GO = "go" - } -} diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/doc/LangDocGenerator.kt b/ee-lang/src/main/kotlin/ee/lang/gen/doc/LangDocGenerator.kt new file mode 100644 index 0000000..ca5548f --- /dev/null +++ b/ee-lang/src/main/kotlin/ee/lang/gen/doc/LangDocGenerator.kt @@ -0,0 +1,48 @@ +package ee.lang.gen.doc + +import ee.lang.* +import ee.lang.gen.common.LangCommonContextFactory +import ee.lang.gen.go.itemNameAsGoFileName +import ee.lang.gen.itemAndTemplateNameAsKotlinFileName +import ee.lang.gen.itemNameAsKotlinFileName +import ee.lang.gen.templateNameAsKotlinFileName +import org.slf4j.LoggerFactory + +open class LangDocGenerator(val model: StructureUnitI<*>, private val targetAsSingleModule: Boolean = false) { + private val log = LoggerFactory.getLogger(javaClass) + + open fun devDoc(fileNamePrefix: String = ""): GeneratorContexts> { + val docTemplates = buildDocTemplates() + val docContextFactory = buildDocContextFactory() + val docContextBuilder = docContextFactory.build() + + val compilationUnits: StructureUnitI<*>.() -> List> = + { items().filterIsInstance(CompilationUnitI::class.java) } + + val generator = GeneratorGroup("documentation", listOf( + GeneratorSimple("DevDocBase", contextBuilder = docContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}DevDocBase", + nameBuilder = itemNameAsMarkdownFileName, + items = compilationUnits, fragments = { listOf(docTemplates.pojoImpl()) })), + GeneratorSimple("DevPlainUmlBase", contextBuilder = docContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}DevPlainUmlBase", + nameBuilder = templateNameAsMarkdownFileName, + items = compilationUnits, fragments = { listOf(docTemplates.pojoPlainImplWithComments()) })), + + GeneratorSimple("DevPlainUmlsuper", contextBuilder = docContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}DevPlainUmlsuper", + nameBuilder = templateNameAsMarkdownFileName, + items = compilationUnits, fragments = { listOf(docTemplates.pojoPlainSuperClass()) })), + + + GeneratorSimple("DevPlainUmlClass", contextBuilder = docContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}DevPlainUmlClass", + nameBuilder = templateNameAsMarkdownFileName, + items = compilationUnits, fragments = { listOf(docTemplates.pojoPlainImplClass()) })))) + return GeneratorContexts(generator, docContextBuilder) + } + + protected open fun buildDocContextFactory() = LangMarkdownContextFactory(targetAsSingleModule) + protected open fun buildDocTemplates() = LangMarkdownTemplates(itemNameAsMarkdownFileName) + +} \ No newline at end of file diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoGenerator.kt b/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoGenerator.kt new file mode 100644 index 0000000..07af8be --- /dev/null +++ b/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoGenerator.kt @@ -0,0 +1,39 @@ +package ee.lang.gen.go + +import ee.lang.* +import ee.lang.gen.common.LangCommonContextFactory +import ee.lang.gen.go.itemNameAsGoFileName +import ee.lang.gen.itemAndTemplateNameAsKotlinFileName +import ee.lang.gen.itemNameAsKotlinFileName +import ee.lang.gen.templateNameAsKotlinFileName +import org.slf4j.LoggerFactory + +open class LangGoGenerator(val model: StructureUnitI<*>, private val targetAsSingleModule: Boolean = false) { + private val log = LoggerFactory.getLogger(javaClass) + + protected open fun buildGoContextFactory() = LangGoContextFactory(targetAsSingleModule) + protected open fun buildGoTemplates() = LangGoTemplates(itemNameAsGoFileName) + + open fun pojoGo(fileNamePrefix: String = ""): GeneratorContexts> { + val goTemplates = buildGoTemplates() + val goContextFactory = buildGoContextFactory() + val goContextBuilder = goContextFactory.buildForImplOnly() + + val enums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java).filter { + it.parent() is StructureUnitI<*> || it.derivedAsType().isNotEmpty() + } + } + val compilationUnits: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> } + } + + val generator = GeneratorGroup("pojoGo", listOf(GeneratorSimple("ApiBase", + contextBuilder = goContextBuilder, template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", + nameBuilder = itemAndTemplateNameAsGoFileName, fragments = { + listOf(ItemsFragment(items = enums, fragments = { listOf(goTemplates.enum()) }), + ItemsFragment(items = compilationUnits, fragments = { listOf(goTemplates.pojo()) })) + })))) + return GeneratorContexts(generator, goContextBuilder) + } +} \ No newline at end of file diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/kt/LangKotlinGenerator.kt b/ee-lang/src/main/kotlin/ee/lang/gen/kt/LangKotlinGenerator.kt new file mode 100644 index 0000000..d7137f6 --- /dev/null +++ b/ee-lang/src/main/kotlin/ee/lang/gen/kt/LangKotlinGenerator.kt @@ -0,0 +1,299 @@ +package ee.lang.gen.kt + +import ee.lang.* +import ee.lang.gen.common.LangCommonContextFactory +import ee.lang.gen.go.itemNameAsGoFileName +import ee.lang.gen.itemAndTemplateNameAsKotlinFileName +import ee.lang.gen.itemNameAsKotlinFileName +import ee.lang.gen.templateNameAsKotlinFileName +import org.slf4j.LoggerFactory + +open class LangKotlinGenerator(val model: StructureUnitI<*>, private val targetAsSingleModule: Boolean = false) { + private val log = LoggerFactory.getLogger(javaClass) + + protected open fun buildKotlinContextFactory() = LangKotlinContextFactory(targetAsSingleModule) + protected open fun buildKotlinTemplates() = LangKotlinTemplates(itemNameAsKotlinFileName) + + open fun dslKt(fileNamePrefix: String = ""): GeneratorContexts> { + val ktTemplates = buildKotlinTemplates() + val ktContextFactory = buildKotlinContextFactory() + val ktContextBuilder = ktContextFactory.buildForDslBuilder() + + val compilationUnits: StructureUnitI<*>.() -> List> = + { items().filterIsInstance(CompilationUnitI::class.java) } + + val generator = GeneratorGroup("dslKt", listOf( + GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}IfcBase", nameBuilder = templateNameAsKotlinFileName, + items = compilationUnits, fragments = { listOf(ktTemplates.dslBuilderI()) })), + GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}ApiBase", nameBuilder = templateNameAsKotlinFileName, + items = compilationUnits, fragments = { listOf(ktTemplates.dslBuilder()) })))) + return GeneratorContexts(generator, ktContextBuilder) + } + + open fun pojoKt(fileNamePrefix: String = ""): GeneratorContexts> { + val ktTemplates = buildKotlinTemplates() + val ktContextFactory = buildKotlinContextFactory() + val ktContextBuilder = ktContextFactory.buildForImplOnly() + val ktContextBuilderTest = ktContextFactory.buildForImplOnly("test") + + val enums: StructureUnitI<*>.() -> List> = { findDownByType(EnumTypeI::class.java) } + val compilationUnits: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } + } + val interfaces: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } + } + + val generator = GeneratorGroup("pojoKt", listOf( + GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(ktTemplates.ifc(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf( + ItemsFragment(items = enums, + fragments = { listOf(ktTemplates.enum()) }), + ItemsFragment(items = compilationUnits, fragments = { + listOf(ktTemplates.pojo(itemNameAsKotlinFileName)) + }) + ) + })), + GeneratorSimple("IfcEmpty", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcEmpty", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(ktTemplates.ifcEmpty(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("ApiTestEnumsBase", contextBuilder = ktContextBuilderTest, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestEnumsBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf( + ItemsFragment(items = enums, + fragments = { + listOf(ktTemplates.enumParseAndIsMethodsTestsParseMethodTests()) + }) + ) + })), + GeneratorSimple("ApiTestBase", contextBuilder = ktContextBuilderTest, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf( + ItemsFragment(items = compilationUnits, + fragments = { + listOf(ktTemplates.pojoTest()) + }) + ) + })))) + return GeneratorContexts(generator, ktContextBuilder) + } + + open fun pojoAndBuildersKt(fileNamePrefix: String = ""): GeneratorContexts> { + val ktTemplates = buildKotlinTemplates() + val ktContextFactory = buildKotlinContextFactory() + val ktContextBuilder = ktContextFactory.buildForImplOnly() + val ktContextBuilderTest = ktContextFactory.buildForImplOnly("test") + + val enums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java) + } + val compilationUnits: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } + } + val interfaces: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } + } + val interfacesNonBlock: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { type -> + type.isIfc() && (type.isNonBlock() || type.operations().find { + it.isNonBlock().notNullValueElse(type.isNonBlock()) + } != null) + } + } + val dataTypes: StructureUnitI<*>.() -> List> = { + findDownByType(DataTypeI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } + } + + registerKtMacros(ktContextFactory) + + val generator = GeneratorGroup("pojoAndBuildersKt", listOf( + GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(ktTemplates.ifc(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("IfcBlockingBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfacesNonBlock, fragments = { + listOf(ktTemplates.ifcBlocking(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("IfcEmpty", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcEmpty", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(ktTemplates.ifcEmpty(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("IfcBlockingEmpty", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingEmpty", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfacesNonBlock, fragments = { + listOf(ktTemplates.emptyBlocking(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("BlockingWrapper", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}BlockingWrapper", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfacesNonBlock, fragments = { + listOf(ktTemplates.blockingWrapper(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = enums, + fragments = { listOf(ktTemplates.enum()) }), + ItemsFragment(items = compilationUnits, fragments = { + listOf(ktTemplates.pojo(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("BuilderIfcBase", contextBuilder = ktContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}BuilderIfcBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, + items = dataTypes, fragments = { listOf(ktTemplates.builderI(itemNameAsKotlinFileName)) })), + GeneratorSimple("BuilderApiBase", contextBuilder = ktContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}BuilderApiBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, + items = dataTypes, fragments = { listOf(ktTemplates.builder(itemNameAsKotlinFileName)) })), + GeneratorSimple("ApiTestEnumsBase", contextBuilder = ktContextBuilderTest, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestEnumsBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = enums, + fragments = { + listOf(ktTemplates.enumParseAndIsMethodsTestsParseMethodTests()) + })) + })), + GeneratorSimple("ApiTestBase", contextBuilder = ktContextBuilderTest, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = compilationUnits, + fragments = { + listOf(ktTemplates.pojoTest()) + })) + })) + )) + return GeneratorContexts(generator, ktContextBuilder, ktContextBuilderTest) + } + + open fun fx(fileNamePrefix: String = ""): GeneratorContexts> { + val ktTemplates = buildKotlinTemplates() + val ktContextFactory = buildKotlinContextFactory() + val ktContextBuilder = ktContextFactory.buildForImplOnly() + val ktContextBuilderTest = ktContextFactory.buildForImplOnly("test") + + val enums: StructureUnitI<*>.() -> List> = { + findDownByType(EnumTypeI::class.java) + } + val compilationUnits: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } + } + val interfaces: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it.isIfc() } + } + val interfacesNonBlock: StructureUnitI<*>.() -> List> = { + findDownByType(CompilationUnitI::class.java).filter { it.isIfc() && it.isNonBlock() } + } + val dataTypes: StructureUnitI<*>.() -> List> = { + findDownByType(DataTypeI::class.java).filter { it !is EnumTypeI<*> && !it.isIfc() } + } + + val generator = GeneratorGroup("pojoAndBuildersKt", listOf( + GeneratorSimple("IfcBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(ktTemplates.ifc(itemNameAsGoFileName)) + })) + })), + GeneratorSimple("IfcBlockingBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfacesNonBlock, fragments = { + listOf(ktTemplates.ifcBlocking(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("IfcEmpty", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcEmpty", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfaces, fragments = { + listOf(ktTemplates.ifcEmpty(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("IfcBlockingEmpty", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}IfcBlockingEmpty", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfacesNonBlock, fragments = { + listOf(ktTemplates.emptyBlocking(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("BlockingWrapper", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}BlockingWrapper", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = interfacesNonBlock, fragments = { + listOf(ktTemplates.blockingWrapper(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("ApiBase", contextBuilder = ktContextBuilder, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = enums, + fragments = { listOf(ktTemplates.enum()) }), + ItemsFragment(items = compilationUnits, fragments = { + listOf(ktTemplates.pojo(itemNameAsKotlinFileName)) + })) + })), + GeneratorSimple("BuilderIfcBase", contextBuilder = ktContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}BuilderIfcBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, + items = dataTypes, fragments = { listOf(ktTemplates.builderI(itemNameAsKotlinFileName)) })), + GeneratorSimple("BuilderApiBase", contextBuilder = ktContextBuilder, + template = ItemsTemplate(name = "${fileNamePrefix}BuilderApiBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, + items = dataTypes, fragments = { listOf(ktTemplates.builder(itemNameAsKotlinFileName)) })), + GeneratorSimple("ApiTestEnumsBase", contextBuilder = ktContextBuilderTest, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestEnumsBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = enums, + fragments = { + listOf(ktTemplates.enumParseAndIsMethodsTestsParseMethodTests()) + })) + })), + GeneratorSimple("ApiTestBase", contextBuilder = ktContextBuilderTest, + template = FragmentsTemplate(name = "${fileNamePrefix}ApiTestBase", + nameBuilder = itemAndTemplateNameAsKotlinFileName, fragments = { + listOf(ItemsFragment(items = compilationUnits, + fragments = { + listOf(ktTemplates.pojoTest()) + })) + })) + )) + return GeneratorContexts(generator, ktContextBuilder, ktContextBuilderTest) + } + + protected fun registerKtMacros(contextFactory: LangCommonContextFactory) { + val macros = contextFactory.macroController + macros.registerMacro(TypeI<*>::toKotlinInstanceEMPTY.name, TypeI<*>::toKotlinInstanceEMPTY) + macros.registerMacro(TypeI<*>::toKotlinInstanceDotEMPTY.name, TypeI<*>::toKotlinInstanceDotEMPTY) + } +} \ No newline at end of file diff --git a/ee-lang_item/src/main/kotlin/ee/lang/DerivedSupport.kt b/ee-lang_item/src/main/kotlin/ee/lang/DerivedSupport.kt index a3b9a7d..123b7dd 100644 --- a/ee-lang_item/src/main/kotlin/ee/lang/DerivedSupport.kt +++ b/ee-lang_item/src/main/kotlin/ee/lang/DerivedSupport.kt @@ -68,7 +68,7 @@ open class DerivedController { } open fun > register(kind: DerivedKind): DerivedKind { - nameToDerivedKind.put(kind.name, kind) + nameToDerivedKind[kind.name] = kind return kind } From 5957afb58d85782519437fc6018d0fc863375ca6 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Thu, 9 Nov 2023 17:11:43 +0100 Subject: [PATCH 5/8] work on Go Cli --- .../ee/design/gen/go/DesignGoGenerator.kt | 12 ++-- .../main/kotlin/ee/design/gen/go/GoClient.kt | 55 ++++++++----------- .../ee/design/gen/go/ModelEventHorizon.kt | 24 ++++---- .../main/kotlin/ee/lang/gen/go/GoCommon.kt | 2 +- .../src/main/kotlin/ee/lang/gen/go/GoPojos.kt | 3 +- .../main/kotlin/ee/lang/gen/go/LangGoUtils.kt | 6 +- 6 files changed, 47 insertions(+), 55 deletions(-) diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt index 1d7d8d5..f62a3ea 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt @@ -547,13 +547,13 @@ open class DesignGoGenerator(private val models: List>, ConstructorI<*>::toGoHttpModuleClientBeforeBody ) - macros.registerMacro(ConstructorI<*>::toGoCliBeforeBody.name, ConstructorI<*>::toGoCliBeforeBody) + macros.registerMacro(ConstructorI<*>::toGoCobraBeforeBody.name, ConstructorI<*>::toGoCobraBeforeBody) - macros.registerMacro(OperationI<*>::toGoCliBuildCommands.name, OperationI<*>::toGoCliBuildCommands) - macros.registerMacro(OperationI<*>::toGoCliDeleteByIdBody.name, OperationI<*>::toGoCliDeleteByIdBody) - macros.registerMacro(OperationI<*>::toGoCliDeleteByIdsBody.name, OperationI<*>::toGoCliDeleteByIdsBody) - macros.registerMacro(OperationI<*>::toGoCliImportJsonBody.name, OperationI<*>::toGoCliImportJsonBody) - macros.registerMacro(OperationI<*>::toGoCliExportJsonBody.name, OperationI<*>::toGoCliExportJsonBody) + macros.registerMacro(OperationI<*>::toGoCobraBuildCommands.name, OperationI<*>::toGoCobraBuildCommands) + macros.registerMacro(OperationI<*>::toGoCobraDeleteByIdBody.name, OperationI<*>::toGoCobraDeleteByIdBody) + macros.registerMacro(OperationI<*>::toGoCobraDeleteByIdsBody.name, OperationI<*>::toGoCobraDeleteByIdsBody) + macros.registerMacro(OperationI<*>::toGoCobraImportJsonBody.name, OperationI<*>::toGoCobraImportJsonBody) + macros.registerMacro(OperationI<*>::toGoCobraExportJsonBody.name, OperationI<*>::toGoCobraExportJsonBody) macros.registerMacro(OperationI<*>::toGoFindByBody.name, OperationI<*>::toGoFindByBody) macros.registerMacro(OperationI<*>::toGoCountByBody.name, OperationI<*>::toGoCountByBody) diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/GoClient.kt b/ee-design/src/main/kotlin/ee/design/gen/go/GoClient.kt index 7a58e82..6f74245 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/GoClient.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/GoClient.kt @@ -5,6 +5,7 @@ import ee.design.DesignDerivedKind import ee.design.EntityI import ee.lang.* import ee.lang.gen.go.g +import ee.lang.gen.go.toGo import java.util.* @@ -113,7 +114,7 @@ fun > T.toGoHttpClientBeforeBody( url = url + "/" + "${item.name().toPlural().replaceFirstChar { it.lowercase(Locale.getDefault()) }}"""" } -fun > T.toGoCliBeforeBody( +fun > T.toGoCobraBeforeBody( c: GenerationContext, derived: String = DesignDerivedKind.IMPL, api: String = DesignDerivedKind.API ): String { @@ -121,18 +122,18 @@ fun > T.toGoCliBeforeBody( client := NewClient(url, httpClient)""" } -fun > T.toGoCliBuildCommands( +fun > T.toGoCobraBuildCommands( c: GenerationContext, derived: String = DesignDerivedKind.IMPL, api: String = DesignDerivedKind.API ): String { return """ - ret = []cli.Command{ - o.BuildCommandImportJSON(),o.BuildCommandExportJSON(),o.BuildCommandDeleteById(),o.BuildCommandDeleteByIds(), + ret = []*cobra.Command{ + o.BuildCommandImportJSON(), o.BuildCommandExportJSON(), o.BuildCommandDeleteById(), o.BuildCommandDeleteByIds(), } """ } -fun > T.toGoCliImportJsonBody( +fun > T.toGoCobraImportJsonBody( c: GenerationContext, derived: String = DesignDerivedKind.IMPL, api: String = DesignDerivedKind.API ): String { @@ -141,7 +142,7 @@ fun > T.toGoCliImportJsonBody( """ } -fun > T.toGoCliExportJsonBody( +fun > T.toGoCobraExportJsonBody( c: GenerationContext, derived: String = DesignDerivedKind.IMPL, api: String = DesignDerivedKind.API ): String { @@ -150,7 +151,7 @@ fun > T.toGoCliExportJsonBody( """ } -fun > T.toGoCliDeleteByIdsBody( +fun > T.toGoCobraDeleteByIdsBody( c: GenerationContext, derived: String = DesignDerivedKind.IMPL, api: String = DesignDerivedKind.API ): String { @@ -158,21 +159,14 @@ fun > T.toGoCliDeleteByIdsBody( val propId = entity.propIdOrAdd() return """ - ret = cli.Command{ - Name: "deleteBy${propId.name().toPlural() + ret = &cobra.Command{ + Short: "deleteBy${propId.name().toPlural() .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}", - Usage: "delete ${entity.name()} by ${propId.name().toPlural()}", - Flags: []cli.Flag{&cli.StringFlag{ - Name: "${propId.name().toPlural()}", - Usage: "${propId.name().toPlural()} of the ${ - entity.name().toPlural() - } to delete, separated by semicolon", - Required: true, - }}, - Action: func(c *cli.Context) (err error) { + Use: "delete ${entity.name()} by ${propId.name().toPlural()}", + RunE: func(cmd *cobra.Command, args []string) (err error) { var ${propId.name()} ${c.n(g.google.uuid.UUID, api)} var ${propId.name().toPlural()} []${c.n(g.google.uuid.UUID, api)} - for _, idString := range ${c.n(g.strings.Split, api)}(c.String("${propId.name().toPlural()}"),",") { + for _, idString := range ${c.n(g.strings.Split, api)}(o.${propId.name().toPlural().toGo()},",") { if id, err = uuid.Parse(idString); err != nil { return } @@ -182,10 +176,11 @@ fun > T.toGoCliDeleteByIdsBody( .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}(${propId.name().toPlural()}) return }, - }""" + } + ret.PersistentFlags().StringVar(&o.${propId.name().toPlural().toGo()}, "${propId.name().toPlural()}", "", "${propId.name().toPlural()} of the ${entity.name().toPlural()} to delete, separated by semicolon")""" } -fun > T.toGoCliDeleteByIdBody( +fun > T.toGoCobraDeleteByIdBody( c: GenerationContext, derived: String = DesignDerivedKind.IMPL, api: String = DesignDerivedKind.API ): String { @@ -193,22 +188,18 @@ fun > T.toGoCliDeleteByIdBody( val propId = entity.propIdOrAdd() return """ - ret = cli.Command{ - Name: "deleteBy${propId.name() + ret = &cobra.Command{ + Short: "deleteBy${propId.name() .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}", - Usage: "delete ${entity.name()} by ${propId.name()}", - Flags: []cli.Flag{&cli.StringFlag{ - Name: "${propId.name()}", - Usage: "${propId.name()} of the ${entity.name()} to delete", - Required: true, - }}, - Action: func(c *cli.Context) (err error) { + Use: "delete ${entity.name()} by ${propId.name()}", + RunE: func(cmd *cobra.Command, args []string) (err error) { var ${propId.name()} ${c.n(g.google.uuid.UUID, api)} - if ${propId.name()}, err = uuid.Parse(c.String("${propId.name()}")); err == nil { + if ${propId.name()}, err = uuid.Parse(o.${propId.toGo()}); err == nil { err = o.Client.DeleteBy${propId.name() .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}(&${propId.name()}) } return }, - }""" + } + ret.PersistentFlags().StringVar(&o.${propId.toGo()}, "${propId.name()}", "", "${propId.name().toPlural()} of the ${entity.name().toPlural()} to delete")""" } \ No newline at end of file diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt b/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt index ef3c891..ad24eeb 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt @@ -133,7 +133,7 @@ fun StructureUnitI<*>.addEsArtifacts() { p(it) { default().value("New${it.name()}(client.${entityClient.dataTypeParentNameAndName()})") } }.toTypedArray() ) - macrosBeforeBody(ConstructorI<*>::toGoCliBeforeBody.name) + macrosBeforeBody(ConstructorI<*>::toGoCobraBeforeBody.name) } } } @@ -635,6 +635,8 @@ private fun EntityI<*>.addCli(client: ControllerI<*>): BusinessControllerI<*> { return controller { name(DesignDerivedType.Cli).derivedAsType(DesignDerivedType.Cli) val entityClient = prop { type(client).name("client") } + val optsPropId = propS { name(propId.name()) } + val optsPropIds = propS { name(propId.name().toPlural()) } constr { params(entityClient) @@ -642,35 +644,35 @@ private fun EntityI<*>.addCli(client: ControllerI<*>): BusinessControllerI<*> { op { name("BuildCommands") - ret(n.List.GT(g.cli.Command)).notErr() + ret(n.List.GT(g.cobra.Command)).notErr() - macrosBody(OperationI<*>::toGoCliBuildCommands.name) + macrosBody(OperationI<*>::toGoCobraBuildCommands.name) } op { name("BuildCommandImportJSON") - ret(g.cli.Command).notErr() - macrosBody(OperationI<*>::toGoCliImportJsonBody.name) + ret(g.cobra.Command).notErr() + macrosBody(OperationI<*>::toGoCobraImportJsonBody.name) } op { name("BuildCommandExportJSON") - ret(g.cli.Command).notErr() - macrosBody(OperationI<*>::toGoCliExportJsonBody.name) + ret(g.cobra.Command).notErr() + macrosBody(OperationI<*>::toGoCobraExportJsonBody.name) } op { name("BuildCommandDeleteBy${propId.name().toPlural() .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}") - ret(g.cli.Command).notErr() - macrosBody(OperationI<*>::toGoCliDeleteByIdsBody.name) + ret(g.cobra.Command).notErr() + macrosBody(OperationI<*>::toGoCobraDeleteByIdsBody.name) } op { name("BuildCommandDeleteBy${propId.name() .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}") - ret(g.cli.Command).notErr() - macrosBody(OperationI<*>::toGoCliDeleteByIdBody.name) + ret(g.cobra.Command).notErr() + macrosBody(OperationI<*>::toGoCobraDeleteByIdBody.name) } } } diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/go/GoCommon.kt b/ee-lang/src/main/kotlin/ee/lang/gen/go/GoCommon.kt index 6df44f2..9c5276e 100644 --- a/ee-lang/src/main/kotlin/ee/lang/gen/go/GoCommon.kt +++ b/ee-lang/src/main/kotlin/ee/lang/gen/go/GoCommon.kt @@ -197,7 +197,7 @@ fun > T.toGoValueByPropName( type().findByNameOrPrimaryOrFirstConstructorFull(parentConstrName) .toGoCallValueByPropName(c, derived, derived, saltIntName, parentConstrName) } else { - (this.parent() == n).ifElse("\"\"", { "${c.n(this, derived)}.EMPTY" }) + (this.parent() == n).ifElse("\"\"") { "${c.n(this, derived)}.EMPTY" } } } } diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/go/GoPojos.kt b/ee-lang/src/main/kotlin/ee/lang/gen/go/GoPojos.kt index 54670c1..42cbba3 100644 --- a/ee-lang/src/main/kotlin/ee/lang/gen/go/GoPojos.kt +++ b/ee-lang/src/main/kotlin/ee/lang/gen/go/GoPojos.kt @@ -4,7 +4,8 @@ import ee.common.ext.* import ee.lang.* import java.util.* -fun LiteralI<*>.toGo(): String = name().replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() } +fun String.toGo(): String = replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() } +fun LiteralI<*>.toGo(): String = name().toGo() fun EnumTypeI<*>.toGoAccess(): String = "${name().replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}s" fun EnumTypeI<*>.toGoLiterals(): String = toGoAccess().replaceFirstChar { it.lowercase(Locale.getDefault()) } diff --git a/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt b/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt index a540dcf..9162f80 100644 --- a/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt +++ b/ee-lang/src/main/kotlin/ee/lang/gen/go/LangGoUtils.kt @@ -265,10 +265,8 @@ object g : StructureUnit({ namespace("").name("Go") }) { } } - object cli : StructureUnit({ namespace("github.com.urfave.cli").name("cli") }) { - val Command = ExternalType { ifc() } - val Context = ExternalType() - val NewApp = Operation() + object cobra : StructureUnit({ namespace("github.com.spf13.cobra").name("cobra") }) { + val Command = ExternalType { } } object logrus : StructureUnit({ namespace("github.com.sirupsen.logrus") }) { From 5b287094b722ff321ffc9fc37b03bb59f75df528 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Thu, 9 Nov 2023 18:13:23 +0100 Subject: [PATCH 6/8] work on Go State Machine --- .../src/main/kotlin/ee/design/DesignUtils.kt | 4 ++-- .../kotlin/ee/design/gen/go/DesignGoGenerator.kt | 16 ++++++++-------- .../ee/design/gen/kt/DesignKotlinGenerator.kt | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ee-design/src/main/kotlin/ee/design/DesignUtils.kt b/ee-design/src/main/kotlin/ee/design/DesignUtils.kt index 36a05a6..ef50d89 100644 --- a/ee-design/src/main/kotlin/ee/design/DesignUtils.kt +++ b/ee-design/src/main/kotlin/ee/design/DesignUtils.kt @@ -186,7 +186,7 @@ fun EntityI<*>.hasNoEvents() = events().isEmpty() && created().isEmpty() && upda fun EntityI<*>.hasNoCommands() = commands().isEmpty() && createBys().isEmpty() && updateBys().isEmpty() && deleteBys().isEmpty() -fun StructureUnitI<*>.renameControllersAccordingParentType() { +fun StructureUnitI<*>.renameArtifactsAccordingParentType() { findDownByType(ControllerI::class.java).forEach { item -> item.extendAdapt { val parent = findParent(CompilationUnitI::class.java) @@ -366,7 +366,7 @@ fun StructureUnitI<*>.addAggregateHandler() { findDownByType(EntityI::class.java).filter { !it.isVirtual() && it.handlers().isEmpty() }.extend { handler { name("Handler") - val initial = state { name("initial") } + val initial = state { name("Initial") } } } } diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt index f62a3ea..1ceb4d1 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/DesignGoGenerator.kt @@ -86,7 +86,7 @@ open class DesignGoGenerator(private val models: List>, addEsArtifacts() - renameControllersAccordingParentType() + renameArtifactsAccordingParentType() //setOptionalTagToEventsAndCommandsProps() @@ -154,15 +154,15 @@ open class DesignGoGenerator(private val models: List>, }.sortedBy { "${it.javaClass.simpleName} ${name()}" } } - val controllersWithOutOps: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(ControllerI::class.java).filter { + val controllersWithoutOps: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(BusinessControllerI::class.java).filter { !it.isIfc() && it.derivedAsType().isEmpty() && it.operations().isEmpty() }.sortedBy { "${it.javaClass.simpleName} ${name()}" } ret } - val controllersWithOps: StructureUnitI<*>.() -> List> = { - val ret = findDownByType(ControllerI::class.java).filter { + val controllersWithOps: StructureUnitI<*>.() -> List> = { + val ret = findDownByType(BusinessControllerI::class.java).filter { !it.isIfc() && it.derivedAsType().isEmpty() && it.operations().isNotEmpty() }.sortedBy { "${it.javaClass.simpleName} ${name()}" } ret @@ -202,7 +202,7 @@ open class DesignGoGenerator(private val models: List>, ItemsFragment, CompilationUnitI<*>>(items = basics, fragments = { listOf(goTemplates.pojo()) }), ItemsFragment(items = enums, fragments = { listOf(goTemplates.enum()) }), - ItemsFragment(items = controllersWithOutOps, fragments = { listOf(goTemplates.pojo()) }) + ItemsFragment(items = controllersWithoutOps, fragments = { listOf(goTemplates.pojo()) }) ) }) ), @@ -328,8 +328,8 @@ open class DesignGoGenerator(private val models: List>, derivedTypes.forEach { derivedType -> - val controllers: StructureUnitI<*>.() -> Collection> = { - findDownByType(type = ControllerI::class.java, stopSteppingDownIfFound = false).filter { + val controllers: StructureUnitI<*>.() -> Collection> = { + findDownByType(type = BusinessControllerI::class.java, stopSteppingDownIfFound = false).filter { !it.isIfc() && it.derivedAsType().equals(derivedType, true) }.sortedBy { "${it.javaClass.simpleName} ${name()}" } } diff --git a/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt b/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt index c01b50f..135cb8a 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/kt/DesignKotlinGenerator.kt @@ -1,7 +1,7 @@ package ee.design.gen.kt import ee.design.ModuleI -import ee.design.renameControllersAccordingParentType +import ee.design.renameArtifactsAccordingParentType import ee.design.markReplaceableConfigProps import ee.lang.* import ee.lang.gen.kt.LangKotlinGenerator @@ -33,7 +33,7 @@ open class DesignKotlinGenerator(model: StructureUnitI<*>, targetAsSingleModule: prepareForKotlinGeneration() //define names for data type controllers - renameControllersAccordingParentType() + renameArtifactsAccordingParentType() markReplaceableConfigProps() } From 3a844c36c26e3e4aa768762dbd18d1ba7daf1dd7 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Thu, 9 Nov 2023 18:31:28 +0100 Subject: [PATCH 7/8] work on Go State Machine --- ee-design/src/main/kotlin/ee/design/DesignUtils.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/ee-design/src/main/kotlin/ee/design/DesignUtils.kt b/ee-design/src/main/kotlin/ee/design/DesignUtils.kt index ef50d89..b8dd360 100644 --- a/ee-design/src/main/kotlin/ee/design/DesignUtils.kt +++ b/ee-design/src/main/kotlin/ee/design/DesignUtils.kt @@ -367,6 +367,7 @@ fun StructureUnitI<*>.addAggregateHandler() { handler { name("Handler") val initial = state { name("Initial") } + defaultState(initial) } } } From e347cd2c736807e0a8c5b854ce1c8263296f9017 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Thu, 9 Nov 2023 18:52:36 +0100 Subject: [PATCH 8/8] work on Go State Machine --- ee-design/src/main/kotlin/ee/design/DesignUtils.kt | 6 +++++- .../src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ee-design/src/main/kotlin/ee/design/DesignUtils.kt b/ee-design/src/main/kotlin/ee/design/DesignUtils.kt index b8dd360..d763f82 100644 --- a/ee-design/src/main/kotlin/ee/design/DesignUtils.kt +++ b/ee-design/src/main/kotlin/ee/design/DesignUtils.kt @@ -255,7 +255,7 @@ fun StructureUnitI<*>.addDefaultReturnValuesForQueries() { } fun StructureUnitI<*>.addCommandsAndEventsForAggregates() { - findDownByType(EntityI::class.java).filter { !it.isVirtual() }.extend { + findDownByType(EntityI::class.java).filter { it.isAggregate() }.extend { if (isDefaultCommands()) { commandCreate() @@ -476,6 +476,10 @@ fun > T.propagateItemToSubtypes(item: CompilationUnitI<* const val PROP_DELETED_AT = "deletedAt" +fun EntityI<*>.isAggregate(): Boolean { + return !isVirtual() && belongsToAggregate().isEMPTY() && derivedAsType().isEmpty() +} + fun EntityI<*>.addPropDeletedAt(): AttributeI<*> { return prop { key(true).type(n.Date).name(PROP_DELETED_AT) diff --git a/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt b/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt index ad24eeb..0ffb4ba 100644 --- a/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt +++ b/ee-design/src/main/kotlin/ee/design/gen/go/ModelEventHorizon.kt @@ -8,7 +8,7 @@ import java.util.* fun StructureUnitI<*>.addEsArtifacts() { - findDownByType(EntityI::class.java).filter { !it.isVirtual() && it.derivedAsType().isEmpty() }.groupBy { + findDownByType(EntityI::class.java).filter { it.isAggregate() }.groupBy { it.findParentMust(ModuleI::class.java) }.forEach { (module, entities) -> module.extend {