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

org.kynthus.hatalib.argparse.concept.UnitParser.scala Maven / Gradle / Ivy

The newest version!
package org.kynthus.hatalib.argparse.concept

import scalaz.{\/, ~~>}

import scala.annotation.implicitNotFound
import scala.language.higherKinds

/**
 * 型を持たないオプションをパーサへ追加できることを表します。
 *
 * @tparam Derived オプションを追加可能な型
 * @author Kynthus Auoeau
 * @since 1.0.0
 * @version 1.0.0
 */
@implicitNotFound("Cannot add parser convert ${Derived}.")
trait UnitParser[Derived] extends Any {

  /**
   * 各オプションの初期値を持つ型です。
   *
   * @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 name    プログラム名
   * @return プログラム名を設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def programName(derived: => Derived, name: String): this.Result

  /**
   * ヘッダメッセージを設定します。
   *
   * @param derived メッセージの追加先
   * @param message ヘッダメッセージ
   * @return ヘッダメッセージを追加した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def head(derived: => Derived, message: String*): this.Result

  /**
   * サブコマンドを追加します。
   *
   * @param derived サブコマンドの追加先
   * @param name    サブコマンド名
   * @return サブコマンドを追加した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def cmd(derived: => Derived, name: String): this.Result

  /**
   * ヘルプ表示用のオプションを追加します。
   *
   * @param derived オプションの追加先
   * @param name    ヘルプ表示用のオプション名
   * @return ヘルプ表示用のオプションを追加した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def help(derived: => Derived, name: String): this.Result

  /**
   * バージョン表示用のオプションを追加します。
   *
   * @param derived オプションの追加先
   * @param name    バージョン表示用のオプション名
   * @return バージョン表示用のオプションを追加した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def version(derived: => Derived, name: String): this.Result

  /**
   * コマンドの使用方法として表示されるメッセージを追加します。
   *
   * @param derived メッセージの追加先
   * @param message コマンド使用方法のメッセージ
   * @return コマンドの使用方法を追加した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def note(derived: => Derived, message: String): this.Result

  /**
   * 実際にコマンドから渡されたオプション値を検証します。
   *
   * コマンドライン引数の解析後に実行され、インスタンスが持つフィールド値を見て判断を行います。
   * 正常値であれば成功を示す型を、異常値であれば失敗を示す型を返します。
   *
   * 今後予想されるScalaz 7.3.x系への移行に備え、
   * いったん[[scalaz.\/]]へ変換後に、その後[[scala.Either]]へ変換します。
   *
   * @param derived       オプションの追加先
   * @param checker       フィールド値に対する、正常・異常の判定処理
   * @param toDisjunction 成功・失敗を表現可能な型から[[scalaz.\/]]へ変換できることを保証する
   * @param toEither      [[scalaz.\/]]から[[scala.Either]]へ変換できることを保証する
   * @tparam UnusedRight    成功を表現する型が持つ右側の型([[scala.Unit]]への変換により破棄)
   * @tparam UnusedCategory 2つの型パラメータを持ち、成功・失敗を表現可能な型
   * @return 検証処理を設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def checkConfig[UnusedRight, UnusedCategory[_, _]]
  (
    derived: => Derived,
    checker: this.Struct => UnusedCategory[String, UnusedRight]
  )(
    implicit
    toDisjunction: UnusedCategory ~~> \/,
    toEither: \/ ~~> Either
  ): this.Result

}

/**
 * パーサへのオプション追加に関連する機能を定義します。
 *
 * @author Kynthus Auoeau
 * @since 1.0.0
 * @version 1.0.0
 */
object UnitParser extends AnyRef {

  /**
   * オプション追加先の型と追加後の型をコンパイル時に取得します。
   *
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  @implicitNotFound("Cannot add parser of OParser[Unit, ${Instance}] convert ${Derived}.")
  final type Aux[
    Derived,
    Instance,
    Output
  ] = UnitParser[Derived] {
    type Struct = Instance
    type Result = Output
  }

  /**
   * 現在のスコープに含まれる[[ElementParser.Aux]]の型クラスインスタンスを取得します。
   *
   * @param base スコープに含まれる型クラスインスタンス
   * @tparam Derived  オプションを追加可能な型
   * @tparam Instance 各オプションの初期値を持つ型
   * @tparam Output   オプションを追加した後の型
   * @return スコープに含まれる型クラスインスタンス
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  final def apply[Derived, Instance, Output]
  (implicit base: this.Aux[Derived, Instance, Output]):
  this.Aux[Derived, Instance, Output] = base

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy