org.kynthus.hatalib.argparse.concept.ElementParser.scala Maven / Gradle / Ivy
The newest version!
package org.kynthus.hatalib.argparse.concept
import scopt.OParser
import scala.annotation.implicitNotFound
/**
* 新しい型に対応したオプションをパーサへ追加できることを表します。
*
* @tparam Derived オプションを追加可能な型
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
@implicitNotFound("Cannot add parser convert ${Derived}.")
trait ElementParser[Derived] extends Any {
/**
* 新しい現在値の型です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
type Member
/**
* 各オプションの初期値を持つ型です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
type Struct
/**
* 現在の型を更新し、さらにオプションを追加した後の型です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
type Result
/**
* パーサに設定したオプションをまとめて追加します。
*
* @param derived オプションの追加先
* @param parser 追加するオプション
* @return 現在の型を更新し、オプションを追加した結果
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
def apply(derived: => Derived, parser: OParser[this.Member, this.Struct]): this.Result
/**
* 単独の位置引数を追加します。
*
* @param derived オプションの追加先
* @param name 位置引数名
* @return 現在の型を更新し、位置引数を追加した結果
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
def arg(derived: => Derived, name: String): this.Result
/**
* 単独のオプション付き引数を追加します。
*
* @param derived オプションの追加先
* @param name オプション名
* @return 現在の型を更新し、オプション付き引数を追加した結果
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
def opt(derived: => Derived, name: String): this.Result
}
/**
* 現在の型の更新とパーサへのオプション追加に関連する機能を定義します。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
object ElementParser extends AnyRef {
/**
* 新しい現在値の型、オプション追加先の型、および追加後の型をコンパイル時に取得します。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
@implicitNotFound("Cannot add parser of OParser[${Input}, ${Instance}] convert ${Derived}.")
final type Aux[
Derived,
Input,
Instance,
Output
] = ElementParser[Derived] {
type Member = Input
type Struct = Instance
type Result = Output
}
/**
* 現在のスコープに含まれる[[ElementParser.Aux]]の型クラスインスタンスを取得します。
*
* @param base スコープに含まれる型クラスインスタンス
* @tparam Derived オプションを追加可能な型
* @tparam Input 新しい現在値の型
* @tparam Instance 各オプションの初期値を持つ型
* @tparam Output 現在の型を更新し、さらにオプションを追加した後の型
* @return スコープに含まれる型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
final def apply[Derived, Input, Instance, Output]
(implicit base: this.Aux[Derived, Input, Instance, Output]):
this.Aux[Derived, Input, Instance, Output] = base
}