All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy