package com.infendro.cli.command import com.infendro.cli.exception.build.MissingOptionNameException import com.infendro.cli.parser.* sealed class Option( val parser: Parser, val fallback: T?, val names: List, ) { val flag: Boolean get() = fallback != null val name: String get() = names[0] abstract val required: Boolean init { if (names.isEmpty()) throw MissingOptionNameException() } class Required( parser: Parser, fallback: T?, names: List, ) : Option(parser, fallback, names) { constructor( parser: Parser, names: List, ) : this(parser, null, names) override val required: Boolean get() = true fun orElse(other: T) = OrElse(parser, fallback, names, other) fun orNull() = OrNull(parser, fallback, names) fun variable() = Variable(parser, fallback, names) } class OrElse( parser: Parser, fallback: T?, names: List, val other: T, ) : Option(parser, fallback, names) { constructor( parser: Parser, names: List, other: T, ) : this(parser, null, names, other) override val required: Boolean get() = false } class OrNull( parser: Parser, fallback: T?, names: List, ) : Option(parser, fallback, names) { constructor( parser: Parser, names: List, ) : this(parser, null, names) override val required: Boolean get() = false } class Variable( parser: Parser, fallback: T?, names: List, ) : Option(parser, fallback, names) { constructor( parser: Parser, names: List, ) : this(parser, null, names) override val required: Boolean get() = false } companion object { fun string(vararg names: String) = Required(StringParser, names.asList()) fun int(vararg names: String) = Required(IntParser, names.asList()) fun long(vararg names: String) = Required(LongParser, names.asList()) fun float(vararg names: String) = Required(FloatParser, names.asList()) fun double(vararg names: String) = Required(DoubleParser, names.asList()) fun boolean(vararg names: String) = Required(BooleanParser, true, names.asList()) inline fun > enum(vararg names: String) = Required(enumParser(), names.asList()) fun regex(vararg names: String) = Required(RegexParser, names.asList()) } }