Extractor[A]
Extractor が実行されたときに A が抽出される型を定義する外部 DSL (Combinator-Parsers) があります。
エクストラクタは、次のステップを継続として呼び出すステップで構成されます。A
エクストラクタは中間抽出 (文字列ベースのキーと値のペア) を作成し、最終的にファクトリによって適切な に変換されます。
抽出器:case class Extractor[A](id: String, start: Step[A], factory: Factory[A])
ステップ:sealed trait Step[A] {
def process(ctx: Context[A]): List[A]
}
工場:trait Factory[A] { def create(extracts: List[(String,String)]): List[A] }
現在、私の抽出パーサーは次のようになっています。
val extractor: Parser[Extractor[_]] = trace ~ "EXTRACT" ~ extractorType ~ extractorId ~ step ^^ {
case t ~ _ ~ ty ~ id ~ step => {
val extr = ty match {
case "SUBTITLES" => {
Extractor[MovieInfos.Subtitle](id, step.asInstanceOf[Step[MovieInfos.Subtitle]], new SubtitleFactory)
}
case x => throw new InvalidExtractorType(x)
}
extr.trace(t)
}
}
EDIT : ステップパーサーには署名がありますval step: Parser[Step[_]]
(ステップパーサーは、そのタイプが正確に解析されていることを知ることができませんStep[A]
。最後に、ステップはA
抽出パーサーによって適切なタイプを取得しますasInstanceOf
)
上記のエクストラクタ パーサーは現在、 extractorType のエクストラクタのみを解析でき"SUBTITLES"
ます。他のextractorTypesを連続して追加したいcase "REVIEWS" => ...
.
各 extractor に対して、タイプ(eg ) のものを作成し、一致するs を extractor に渡すExtractor[A]
特殊なファクトリ (eg ) を提供する必要があります(それが の目的です)。new SubtitleFactory
A
MovieInfos.Subtitle
step
asInstanceOf
パーサーはさまざまな Extractor-Types (字幕、画像、Audiotracks など) を解析するParser[Extractor[_]]
必要があるため、 を使用します。
step.asInstanceOf[Step[MovieInfos.Subtitle]]
さらに、すでに適切なタイプを提供しているので、少し怪しいものは避けたいExtractor[MovieInfos.Subtitle]
そして最後に、何らかの構成/フックによって拡張可能な、より柔軟な Factory が必要です。
任意の推奨事項をいただければ幸いです。