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

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

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

import scalaz.Optional
import scopt.{OParserSetup, RenderingMode}

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

/**
 * 特定の型がパーサの動作設定を保持できることを表します。
 *
 * このトレイトは型クラスとなっており、例えば[[scala.Predef.Map]]を設定値保持用とするには、
 * 例に示すような型クラスインスタンスを定義します。
 *
 * @tparam Derived パーサの動作設定を保持する型
 * @author Kynthus Auoeau
 * @since 1.0.0
 * @version 1.0.0
 */
@implicitNotFound("Cannot add parser's setup convert ${Derived}.")
trait Setup[Derived] extends Any {

  /**
   * 追加後に返すべきパーサの動作設定を保持する型です。
   *
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  type Result

  /**
   * パーサの動作設定を行います。
   *
   * @param derived パーサの動作設定を持つ値
   * @param setup   パーサの動作設定
   * @return パーサの動作設定を行った結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def apply(derived: => Derived, setup: OParserSetup): this.Result

  /**
   * パーサの出力形式を設定します。
   *
   * @param derived パーサの動作設定を持つ値
   * @param mode    出力形式
   * @return パーサの出力形式を設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def renderingMode(derived: => Derived, mode: RenderingMode): this.Result

  /**
   * 未知のオプションをエラー扱いとするか設定します。
   *
   * @param derived パーサの動作設定を持つ値
   * @param isError エラー扱いとする場合は`true`、しない場合は`false`
   * @return 未知のオプションをエラー扱いとするか設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def errorOnUnknownArgument(derived: => Derived, isError: Boolean): this.Result

  /**
   * 解析失敗時にコマンドの使用方法を表示するか設定します。
   *
   * @param derived パーサの動作設定を持つ値
   * @param isShow  `true`を持つ有効値の場合は表示し、それ以外の場合は表示しない
   * @tparam UnusedCategory 型パラメータを持ち、値を持たない可能性を表現可能な型
   * @return 解析失敗時にコマンドの使用方法を表示するか設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def showUsageOnError[UnusedCategory[_] : Optional]
  (derived: => Derived, isShow: UnusedCategory[Boolean]): this.Result

  /**
   * 解析結果のうち正常なメッセージをどう扱うか設定します。
   *
   * @param derived パーサの動作設定を持つ値
   * @param display メッセージに対する処理
   * @tparam Unused メッセージに対する処理の結果得られる型(最終的に[[scala.Unit]]となり破棄)
   * @return 正常なメッセージの扱いについて設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def displayToOut[Unused](derived: => Derived, display: String => Unused): this.Result

  /**
   * 解析結果のうちエラーメッセージをどう扱うか設定します。
   *
   * @param derived パーサの動作設定を持つ値
   * @param display メッセージに対する処理
   * @tparam Unused メッセージに対する処理の結果得られる型(最終的に[[scala.Unit]]となり破棄)
   * @return エラーメッセージの扱いについて設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def displayToErr[Unused](derived: => Derived, display: String => Unused): this.Result

  /**
   * エラー発生時のレポートの処理方法を設定します。
   *
   * @param derived パーサの動作設定を持つ値
   * @param report  レポート処理
   * @tparam Unused レポート処理後に得られる型(最終的に[[scala.Unit]]となり破棄)
   * @return エラー発生時のレポートの処理方法を設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def reportError[Unused](derived: => Derived, report: String => Unused): this.Result

  /**
   * 警告発生時のレポートの処理方法を設定します。
   *
   * @param derived パーサの動作設定を持つ値
   * @param report  レポート処理
   * @tparam Unused レポート処理後に得られる型(最終的に[[scala.Unit]]となり破棄)
   * @return 警告発生時のレポートの処理方法を設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def reportWarning[Unused](derived: => Derived, report: String => Unused): this.Result

  /**
   * ヘルプおよびバージョン情報表示後にどう終了するかを設定します。
   *
   * @param derived    パーサの動作設定を持つ値
   * @param terminator ヘルプおよびバージョン情報表示後に呼ばれる終了処理
   * @tparam UnusedResult 終了処理後に得られる型(最終的に[[scala.Unit]]となり破棄)
   * @return 終了処理を設定した結果
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  def terminate[UnusedResult]
  (derived: => Derived, terminator: Either[String, Unit] => UnusedResult): this.Result

}

/**
 * パーサの動作設定に関連する機能を定義します。
 *
 * @author Kynthus Auoeau
 * @since 1.0.0
 * @version 1.0.0
 */
object Setup extends AnyRef {

  /**
   * 動作設定後の型をコンパイル時に取得します。
   *
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  @implicitNotFound("Cannot add parser's setup convert ${Derived}.")
  final type Aux[Derived, Output] = Setup[Derived] {type Result = Output}

  /**
   * 現在のスコープに含まれる[[Setup.Aux]]の型クラスインスタンスを取得します。
   *
   * @param base スコープに含まれる型クラスインスタンス
   * @tparam Derived パーサの動作設定を保持する型
   * @tparam Output  パーサの動作設定後の型
   * @return スコープに含まれる型クラスインスタンス
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  final def apply[Derived, Output]
  (implicit base: this.Aux[Derived, Output]):
  this.Aux[Derived, Output] = base

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy