Skip to content

Commit

Permalink
split processing logic into separate modules
Browse files Browse the repository at this point in the history
  • Loading branch information
egorikftp committed Jul 5, 2024
1 parent 2e0a47d commit b46aa58
Show file tree
Hide file tree
Showing 48 changed files with 279 additions and 194 deletions.
13 changes: 13 additions & 0 deletions components/generator/common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
plugins {
alias(libs.plugins.kotlin.jvm)
}

repositories {
mavenCentral()
}

dependencies {
implementation(libs.kotlinpoet)

testImplementation(libs.kotlin.test)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.composegears.valkyrie.processing.generator.imagevector.ext
package io.github.composegears.valkyrie.generator.ext

fun Float.trimTrailingZero(): String {
val value = this.toString()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.composegears.valkyrie.processing.generator.imagevector.ext
package io.github.composegears.valkyrie.generator.ext

import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.FunSpec
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.composegears.valkyrie.processing.generator.imagevector.ext
package io.github.composegears.valkyrie.generator.ext

import com.squareup.kotlinpoet.TypeName

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package io.github.composegears.valkyrie
package io.github.composegears.valkyrie.generator.ext

import io.github.composegears.valkyrie.processing.generator.imagevector.ext.formatFloat
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.toColorHex
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.trimTrailingZero
import org.junit.Test
import kotlin.test.assertEquals

Expand Down
15 changes: 15 additions & 0 deletions components/generator/iconpack/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
plugins {
alias(libs.plugins.kotlin.jvm)
}

repositories {
mavenCentral()
}

dependencies {
implementation(projects.components.generator.common)

implementation(libs.kotlinpoet)

testImplementation(libs.kotlin.test)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.github.composegears.valkyrie.generator.iconpack

import io.github.composegears.valkyrie.generator.ext.fileSpecBuilder
import io.github.composegears.valkyrie.generator.ext.objectBuilder
import io.github.composegears.valkyrie.generator.ext.removeDeadCode
import io.github.composegears.valkyrie.generator.ext.setIndent

internal class IconPackFileSpec(private val config: IconPackGeneratorConfig) {

fun createSpec(): IconPackSpecOutput {
val iconPackSpec = objectBuilder(name = config.iconPackName) {
config.subPacks.forEach { icon ->
addType(objectBuilder(name = icon))
}
}
val fileSpec = fileSpecBuilder(
packageName = config.packageName,
fileName = config.iconPackName
) {
addType(iconPackSpec)
setIndent()
}
return IconPackSpecOutput(
content = fileSpec.removeDeadCode(),
name = fileSpec.name
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.github.composegears.valkyrie.generator.iconpack

data class IconPackGeneratorConfig(
val packageName: String,
val iconPackName: String,
val subPacks: List<String>
)

data class IconPackSpecOutput(
val content: String,
val name: String
)

object IconPackGenerator {

fun create(config: IconPackGeneratorConfig) = IconPackFileSpec(config).createSpec()
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package io.github.composegears.valkyrie
package io.github.composegears.valkyrie.generator.iconpack

import io.github.composegears.valkyrie.processing.generator.iconpack.IconPackGenerator
import io.github.composegears.valkyrie.processing.generator.iconpack.IconPackGeneratorConfig
import org.junit.Test
import kotlin.test.assertEquals

class IconPackGeneratorTest {

@Test
fun `generate icon pack`() {
val result = IconPackGenerator(
val result = IconPackGenerator.create(
config = IconPackGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
iconPackName = "ValkyrieIcons",
subPacks = emptyList()
)
).generate()
)

val expectedContent = """
package io.github.composegears.valkyrie.icons
Expand All @@ -30,13 +28,13 @@ class IconPackGeneratorTest {

@Test
fun `generate nested packs`() {
val result = IconPackGenerator(
val result = IconPackGenerator.create(
config = IconPackGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
iconPackName = "ValkyrieIcons",
subPacks = listOf("Filled", "Colored")
)
).generate()
)

val expectedContent = """
package io.github.composegears.valkyrie.icons
Expand Down
18 changes: 18 additions & 0 deletions components/generator/imagevector/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
plugins {
alias(libs.plugins.kotlin.jvm)
}

repositories {
google()
mavenCentral()
}

dependencies {
implementation(projects.components.generator.common)
implementation(projects.components.google)

implementation(libs.kotlinpoet)

testImplementation(projects.components.parser)
testImplementation(libs.kotlin.test)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.composegears.valkyrie.processing.generator.imagevector
package io.github.composegears.valkyrie.generator.imagevector

import androidx.compose.material.icons.generator.ClassNames
import androidx.compose.material.icons.generator.MemberNames
Expand All @@ -9,39 +9,27 @@ import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.buildCodeBlock
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.fileSpecBuilder
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.getterFunSpecBuilder
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.propertySpecBuilder
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.removeDeadCode
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.setIndent
import io.github.composegears.valkyrie.processing.generator.imagevector.util.addPath
import io.github.composegears.valkyrie.processing.generator.imagevector.util.backingPropertyName
import io.github.composegears.valkyrie.processing.generator.imagevector.util.backingPropertySpec
import io.github.composegears.valkyrie.processing.generator.imagevector.util.iconPreviewSpec
import io.github.composegears.valkyrie.processing.generator.imagevector.util.iconPreviewSpecForNestedPack
import io.github.composegears.valkyrie.processing.generator.imagevector.util.imageVectorBuilderSpecs
import io.github.composegears.valkyrie.generator.ext.fileSpecBuilder
import io.github.composegears.valkyrie.generator.ext.getterFunSpecBuilder
import io.github.composegears.valkyrie.generator.ext.propertySpecBuilder
import io.github.composegears.valkyrie.generator.ext.removeDeadCode
import io.github.composegears.valkyrie.generator.ext.setIndent
import io.github.composegears.valkyrie.generator.imagevector.util.addPath
import io.github.composegears.valkyrie.generator.imagevector.util.backingPropertyName
import io.github.composegears.valkyrie.generator.imagevector.util.backingPropertySpec
import io.github.composegears.valkyrie.generator.imagevector.util.iconPreviewSpec
import io.github.composegears.valkyrie.generator.imagevector.util.iconPreviewSpecForNestedPack
import io.github.composegears.valkyrie.generator.imagevector.util.imageVectorBuilderSpecs

data class ImageVectorSpecConfig(
internal data class ImageVectorSpecConfig(
val iconName: String,
val iconPack: String,
val iconNestedPack: String,
val iconPackage: String,
val generatePreview: Boolean,
)

data class ImageVectorSpecOutput(
val content: String,
val name: String
) {
companion object {
val empty = ImageVectorSpecOutput(
content = "",
name = ""
)
}
}

class ImageVectorFileSpec(private val config: ImageVectorSpecConfig) {
internal class ImageVectorFileSpec(private val config: ImageVectorSpecConfig) {

fun createFileFor(vector: Vector): ImageVectorSpecOutput {
val backingProperty = backingPropertySpec(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.github.composegears.valkyrie.processing.generator.imagevector
package io.github.composegears.valkyrie.generator.imagevector

import io.github.composegears.valkyrie.processing.parser.IconParserOutput
import androidx.compose.material.icons.generator.vector.Vector

data class ImageVectorGeneratorConfig(
val packageName: String,
Expand All @@ -9,18 +9,31 @@ data class ImageVectorGeneratorConfig(
val generatePreview: Boolean
)

data class ImageVectorSpecOutput(
val content: String,
val name: String
) {
companion object {
val empty = ImageVectorSpecOutput(
content = "",
name = ""
)
}
}

object ImageVectorGenerator {

fun convert(
parserOutput: IconParserOutput,
vector: Vector,
kotlinName: String,
config: ImageVectorGeneratorConfig
): ImageVectorSpecOutput = ImageVectorFileSpec(
config = ImageVectorSpecConfig(
iconPackage = config.packageName,
iconPack = config.packName,
iconName = parserOutput.kotlinName,
iconName = kotlinName,
iconNestedPack = config.nestedPackName,
generatePreview = config.generatePreview
)
).createFileFor(parserOutput.vector)
).createFileFor(vector)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.github.composegears.valkyrie.generator.imagevector.util

import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.TypeName
import io.github.composegears.valkyrie.generator.ext.nullable
import io.github.composegears.valkyrie.generator.ext.propertySpecBuilder

internal fun String.backingPropertyName() = "_$this"

internal fun backingPropertySpec(
name: String,
type: TypeName
) = propertySpecBuilder(name = name, type = type.nullable()) {
mutable()
addModifiers(KModifier.PRIVATE)
initializer("null")
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package io.github.composegears.valkyrie.processing.generator.imagevector.util
package io.github.composegears.valkyrie.generator.imagevector.util

import androidx.compose.material.icons.generator.ClassNames
import androidx.compose.material.icons.generator.MemberNames
import androidx.compose.material.icons.generator.vector.Vector
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.buildCodeBlock
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.formatFloat
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.trimTrailingZero
import io.github.composegears.valkyrie.generator.ext.formatFloat
import io.github.composegears.valkyrie.generator.ext.trimTrailingZero

fun imageVectorBuilderSpecs(
internal fun imageVectorBuilderSpecs(
iconName: String,
vector: Vector,
path: CodeBlock.Builder.() -> Unit,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
package io.github.composegears.valkyrie.processing.generator.imagevector.util
package io.github.composegears.valkyrie.generator.imagevector.util

import androidx.compose.material.icons.generator.ClassNames
import androidx.compose.material.icons.generator.MemberNames
import androidx.compose.material.icons.generator.vector.Fill
import androidx.compose.material.icons.generator.vector.FillType
import androidx.compose.material.icons.generator.vector.StrokeCap
import androidx.compose.material.icons.generator.vector.StrokeJoin
import androidx.compose.material.icons.generator.vector.VectorNode
import androidx.compose.ui.graphics.PathFillType
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.buildCodeBlock
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.formatFloat
import io.github.composegears.valkyrie.processing.generator.imagevector.ext.toColorHex
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.FillAlphaParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.FillParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.FillTypeParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.StrokeAlphaParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.StrokeColorHexParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.StrokeLineCapParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.StrokeLineJoinParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.StrokeLineMiterParam
import io.github.composegears.valkyrie.processing.generator.imagevector.util.PathParams.StrokeLineWidthParam

fun CodeBlock.Builder.addPath(
import io.github.composegears.valkyrie.generator.ext.formatFloat
import io.github.composegears.valkyrie.generator.ext.toColorHex
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.FillAlphaParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.FillParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.FillTypeParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.StrokeAlphaParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.StrokeColorHexParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.StrokeLineCapParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.StrokeLineJoinParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.StrokeLineMiterParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.StrokeLineWidthParam

internal fun CodeBlock.Builder.addPath(
path: VectorNode.Path,
pathBody: CodeBlock.Builder.() -> Unit
) {
Expand Down Expand Up @@ -146,19 +146,19 @@ private fun CodeBlock.Builder.strokeLineWidthArg(param: StrokeLineWidthParam) {
}

private fun CodeBlock.Builder.strokeLineCapArg(param: StrokeLineCapParam) {
add("strokeLineCap = %T.%L", androidx.compose.ui.graphics.StrokeCap::class, param.strokeLineCap.name)
add("strokeLineCap = %T.%L", ClassNames.StrokeCap, param.strokeLineCap.name)
}

private fun CodeBlock.Builder.strokeLineJoinArg(param: StrokeLineJoinParam) {
add("strokeLineJoin = %T.%L", androidx.compose.ui.graphics.StrokeJoin::class, param.strokeLineJoin.name)
add("strokeLineJoin = %T.%L", ClassNames.StrokeJoin, param.strokeLineJoin.name)
}

private fun CodeBlock.Builder.strokeLineMiterArg(param: StrokeLineMiterParam) {
add("strokeLineMiter = ${param.strokeLineMiter.formatFloat()}")
}

private fun CodeBlock.Builder.pathFillTypeArg(param: FillTypeParam) {
add("pathFillType = %T.%L", PathFillType::class, param.fillType.name)
add("pathFillType = %T.%L", ClassNames.PathFillType, param.fillType.name)
}

private fun VectorNode.Path.buildPathParams() = buildList {
Expand Down Expand Up @@ -191,7 +191,7 @@ private fun VectorNode.Path.buildPathParams() = buildList {
}
}

sealed interface PathParams {
internal sealed interface PathParams {
data class FillParam(val fill: Fill) : PathParams
data class FillAlphaParam(val fillAlpha: Float) : PathParams
data class StrokeColorHexParam(val strokeColorHex: String) : PathParams
Expand Down
Loading

0 comments on commit b46aa58

Please sign in to comment.