From 3e09eee5b756e94cc51f70aa876485f86bea9167 Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Wed, 1 Dec 2021 19:47:11 +0100 Subject: [PATCH] Add some magic --- 2021/src/main/kotlin/Day01.kt | 2 +- 2021/src/main/kotlin/Main.kt | 8 ++--- .../be/vandewalleh/aoc/utils/DayRunner.kt | 36 +++++++++++++++++++ .../aoc/utils/factory/DayFactory.kt | 4 +++ .../aoc/utils/input/Annotations.kt | 4 ++- .../aoc/utils/input/InputFactory.kt | 6 +++- 6 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 utils/src/main/kotlin/be/vandewalleh/aoc/utils/DayRunner.kt diff --git a/2021/src/main/kotlin/Day01.kt b/2021/src/main/kotlin/Day01.kt index 05caed8..3ada987 100644 --- a/2021/src/main/kotlin/Day01.kt +++ b/2021/src/main/kotlin/Day01.kt @@ -3,7 +3,7 @@ package be.vandewalleh.aoc.days import be.vandewalleh.aoc.utils.input.Day import be.vandewalleh.aoc.utils.input.Lines -@Day(1) +@Day class Day01(@Lines val items: IntArray) { fun part1(): Int { diff --git a/2021/src/main/kotlin/Main.kt b/2021/src/main/kotlin/Main.kt index f7c0440..dc030c5 100644 --- a/2021/src/main/kotlin/Main.kt +++ b/2021/src/main/kotlin/Main.kt @@ -1,9 +1,5 @@ package be.vandewalleh.aoc.days -import be.vandewalleh.aoc.utils.factory.createDay +import be.vandewalleh.aoc.utils.runDay -fun main() { - with(createDay()) { - println(part2()) - } -} +fun main() = runDay() diff --git a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/DayRunner.kt b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/DayRunner.kt new file mode 100644 index 0000000..7724134 --- /dev/null +++ b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/DayRunner.kt @@ -0,0 +1,36 @@ +package be.vandewalleh.aoc.utils + +import be.vandewalleh.aoc.utils.factory.findDayDefinition +import io.micronaut.context.BeanContext +import java.time.LocalDate + +fun runDay(day: Int = LocalDate.now().dayOfMonth) { + val ctx = BeanContext.run() + val definition = ctx.findDayDefinition(day) + + if (definition == null) { + println("Day not found") + return + } + + val instance = ctx.getBean(definition) + val part1Handle = ctx.findExecutionHandle(instance, "part1") + if (part1Handle.isEmpty) { + println("part1() not found") + return + } + + println("*** Day $day ***") + println() + println("part 1:") + println(part1Handle.get().invoke()) + + println() + val part2Handle = ctx.findExecutionHandle(instance, "part2") + if (part2Handle.isEmpty) { + println("part2() not found") + return + } + println("part 2:") + println(part2Handle.get().invoke()) +} diff --git a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt index c24f677..87da20d 100644 --- a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt +++ b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt @@ -4,10 +4,14 @@ package be.vandewalleh.aoc.utils.factory import be.vandewalleh.aoc.utils.input.TempFileResourceLoader import io.micronaut.context.BeanContext +import io.micronaut.inject.BeanDefinition import java.io.File fun createDay(beanType: Class): T = BeanContext.run().getBean(beanType) +fun BeanContext.findDayDefinition(day: Int): BeanDefinition<*>? = allBeanDefinitions + .find { it.name == "be.vandewalleh.aoc.days.Day${day.toString().padStart(length = 2, '0')}" } + inline fun createDay() = createDay(T::class.java) // A custom resourceLoader that returns a string should be more appropriate but ¯\_(ツ)_/¯ diff --git a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/Annotations.kt b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/Annotations.kt index 5b75f0c..4e3e6b4 100644 --- a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/Annotations.kt +++ b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/Annotations.kt @@ -2,6 +2,7 @@ package be.vandewalleh.aoc.utils.input +import io.micronaut.context.annotation.Executable import io.micronaut.context.annotation.Prototype import io.micronaut.core.annotation.Introspected import jakarta.inject.Qualifier @@ -12,7 +13,8 @@ import java.lang.annotation.Inherited @Introspected @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) -annotation class Day(val value: Int) +@Executable +annotation class Day(val value: Int = -1) @Qualifier @Prototype diff --git a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/InputFactory.kt b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/InputFactory.kt index 7901ffa..1e833c3 100644 --- a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/InputFactory.kt +++ b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/input/InputFactory.kt @@ -54,7 +54,11 @@ class InputFactory(private val resourceLoader: ResourceLoader) { if (dayAnnotation.isEmpty) error("@DayInput cannot only be used on classes annotated with ${Day::class.qualifiedName}") - return dayAnnotation.get().intValue("value").asInt + val dayFromAnnotation = dayAnnotation.get().intValue("value").orElse(-1) + return if (dayFromAnnotation == -1) + injectionPoint.declaringBean.beanType.simpleName.replace("Day", "").toInt() + else + dayFromAnnotation } }