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

org.kynthus.hatalib.argparse.instance.BuilderInstances0.scala Maven / Gradle / Ivy

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

import org.kynthus.hatalib.core.concept.{Builder, ResultCategory, Run}
import org.kynthus.hatalib.core.syntax.PhantomSyntax.PhantomOps
import org.kynthus.hatalib.core.syntax.TagSyntax.TagOps
import scalaz.syntax.applicative.ApplicativeIdV
import scalaz.{@@, Applicative, Tag}
import scopt.OParser
import shapeless.labelled.FieldType
import shapeless.{::, HNil}

import scala.language.higherKinds

/**
 * コマンドライン引数解析にあたり構築情報を生成する型クラスインスタンスの第1候補です。
 *
 * @author Kynthus Auoeau
 * @since 1.0.0
 * @version 1.0.0
 */
private[instance] trait BuilderInstances0 extends Any {

  /**
   * 空の構築情報を生成します。
   *
   * @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
   * @param applicative 構築情報をラップ可能なことを保証する
   * @tparam Category 構築情報をラップする型
   * @return 空の構築情報を生成する型クラスインスタンス
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  implicit final def OParserParseBuilder[Category[_]]
  (
    implicit
    runCategory: ResultCategory[Category] @@ Run.type,
    applicative: Applicative[Category]
  ): Builder.Aux[
    OParser.type,
    Category[(FieldType[ParserHierarchy.T, HNil] :: HNil) @@ Unit]
  ] @@ OParser.type = BuilderInstances0.OParserParseBuilder

}

/**
 * コマンドライン引数解析にあたり構築情報を生成する型クラスインスタンスの第1候補を内部的に定義します。
 *
 * @author Kynthus Auoeau
 * @since 1.0.0
 * @version 1.0.0
 */
private object BuilderInstances0 extends AnyRef {

  /**
   * 空の構築情報を生成します(内部)。
   *
   * @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
   * @param applicative 構築情報をラップ可能なことを保証する
   * @tparam Category 構築情報をラップする型
   * @return 空の構築情報を生成する型クラスインスタンス
   * @author Kynthus Auoeau
   * @since 1.0.0
   * @version 1.0.0
   */
  private final def OParserParseBuilder[Category[_]]
  (
    implicit
    runCategory: ResultCategory[Category] @@ Run.type,
    applicative: Applicative[Category]
  ): Builder.Aux[
    OParser.type,
    Category[(FieldType[ParserHierarchy.T, HNil] :: HNil) @@ Unit]
  ] @@ OParser.type = Tag {

    new Builder[OParser.type] {

      /**
       * パーサ階層のみ持つ構築情報をラップした型を生成します。
       *
       * @author Kynthus Auoeau
       * @since 1.0.0
       * @version 1.0.0
       */
      override type Result = Category[(FieldType[ParserHierarchy.T, HNil] :: HNil) @@ Unit]

      /**
       * パーサ階層のみ持つ空の構築情報を返します。
       *
       * @param derived [[scopt.OParser]]のコンパニオンオブジェクト(情報を持たないため未使用)
       * @return パーサ階層のみ持つ空の構築情報
       * @author Kynthus Auoeau
       * @since 1.0.0
       * @version 1.0.0
       */
      override def apply(derived: => OParser.type): super.Result = {

        // 空のパーサ階層を構築
        val defaultHierarchy: FieldType[ParserHierarchy.T, HNil] = HNil.phantom
        val defaultData: FieldType[ParserHierarchy.T, HNil] :: HNil = defaultHierarchy :: HNil

        // タグ付けして返す
        val defaultTagged: (FieldType[ParserHierarchy.T, HNil] :: HNil) @@ Unit = defaultData.wrap
        defaultTagged.pure

      }

    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy