package com.infendro.cli.command import com.infendro.cli.parser.* import com.infendro.cli.parser.Parser sealed class Argument( val parser: Parser, ) { abstract val required: Boolean class Required( parser: Parser, ) : Argument(parser) { override val required: Boolean get() = true } class OrElse( val other: T, parser: Parser, ) : Argument(parser) { override val required: Boolean get() = false } class OrNull( parser: Parser, ) : Argument(parser) { override val required: Boolean get() = false } class Variable( parser: Parser, ) : Argument(parser) { override val required: Boolean get() = false } companion object { fun string() = Required(StringParser) fun stringOrElse(other: String) = OrElse(other, StringParser) fun stringOrNull() = OrNull(StringParser) fun strings() = Variable(StringParser) fun int() = Required(IntParser) fun intOrElse(other: Int) = OrElse(other, IntParser) fun intOrNull() = OrNull(IntParser) fun ints() = Variable(IntParser) fun boolean() = Required(BooleanParser) fun booleanOrElse(other: Boolean) = OrElse(other, BooleanParser) fun booleanOrNull() = OrNull(BooleanParser) 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()) } }