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
}