diff --git a/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt b/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt index 53a4ec7..3175660 100644 --- a/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt +++ b/src/commonMain/kotlin/com/infendro/cli/command/Argument.kt @@ -1,9 +1,7 @@ package com.infendro.cli.command -import com.infendro.cli.parser.BooleanParser -import com.infendro.cli.parser.IntParser +import com.infendro.cli.parser.* import com.infendro.cli.parser.Parser -import com.infendro.cli.parser.StringParser sealed class Argument( val parser: Parser, @@ -75,5 +73,17 @@ sealed class Argument( fun booleans() = Variable(BooleanParser) + + inline fun > enum() = + Required(enumParser()) + + inline fun > enumOrElse(other: T) = + OrElse(other, enumParser()) + + inline fun > enumOrNull() = + OrNull(enumParser()) + + inline fun > enums() = + Variable(enumParser()) } } diff --git a/src/commonMain/kotlin/com/infendro/cli/command/Option.kt b/src/commonMain/kotlin/com/infendro/cli/command/Option.kt index 8b342b5..23f9af6 100644 --- a/src/commonMain/kotlin/com/infendro/cli/command/Option.kt +++ b/src/commonMain/kotlin/com/infendro/cli/command/Option.kt @@ -1,10 +1,8 @@ package com.infendro.cli.command import com.infendro.cli.exception.build.NoOptionNameException -import com.infendro.cli.parser.BooleanParser -import com.infendro.cli.parser.IntParser +import com.infendro.cli.parser.* import com.infendro.cli.parser.Parser -import com.infendro.cli.parser.StringParser sealed class Option( val names: List, @@ -89,5 +87,17 @@ sealed class Option( fun booleans(vararg names: String) = Variable(names.asList(), BooleanParser) + + inline fun > enum(vararg names: String) = + Required(names.asList(), enumParser()) + + inline fun > enumOrElse(vararg names: String, other: T) = + OrElse(names.asList(), other, enumParser()) + + inline fun > enumOrNull(vararg names: String) = + OrNull(names.asList(), enumParser()) + + inline fun > enums(vararg names: String) = + Variable(names.asList(), enumParser()) } } diff --git a/src/commonMain/kotlin/com/infendro/cli/parser/EnumParser.kt b/src/commonMain/kotlin/com/infendro/cli/parser/EnumParser.kt new file mode 100644 index 0000000..df04cbf --- /dev/null +++ b/src/commonMain/kotlin/com/infendro/cli/parser/EnumParser.kt @@ -0,0 +1,17 @@ +package com.infendro.cli.parser + +import com.infendro.cli.exception.run.ParseException +import kotlin.enums.enumEntries + +class EnumParser>( + private val name: String, + private val values: List, +) : Parser { + override fun parse(text: String?): T = try { + values.first { it.name == text } + } catch (_: Exception) { + throw ParseException(text, name) + } +} + +inline fun > enumParser() = EnumParser(T::class.simpleName!!, enumEntries())