11package com .codacy .parsers
22
3+ import java .io .File
4+
35import com .codacy .api .{CoverageReport , Language }
46import com .codacy .parsers .implementation .{CoberturaParser , JacocoParser }
57import com .codacy .parsers .util .XML
6- import java . io . File
8+
79import scala .util .Try
810import scala .xml .Elem
911
@@ -25,9 +27,17 @@ trait XMLCoverageParser extends CoverageParser {
2527
2628}
2729
30+ trait CoverageParserFactory {
31+ def apply (language : Language .Value , rootProject : File , reportFile : File ): CoverageParser
32+ }
33+
2834object CoverageParserFactory {
2935
30- def withCoverageReport [A ](language : Language .Value , rootProject : File , reportFile : File )(block : CoverageReport => A ): Either [String , A ] = {
36+ def withCoverageReport [A ](language : Language .Value ,
37+ rootProject : File ,
38+ reportFile : File ,
39+ parserFactory : Option [CoverageParserFactory ] = None
40+ )(block : CoverageReport => A ): Either [String , A ] = {
3141 val isEmptyReport = {
3242 // just starting by detecting the simplest case: a single report file
3343 Try (reportFile.isFile && reportFile.length() == 0 ).getOrElse(false )
@@ -36,27 +46,27 @@ object CoverageParserFactory {
3646 if (isEmptyReport) {
3747 Left (s " report file is empty: ${reportFile.getAbsolutePath}" )
3848 } else {
39- create(language, rootProject, reportFile).map {
40- parser =>
41- val report = parser.generateReport( )
42- Right (block(report))
43- }.getOrElse {
44- Left ( s " no parser for $language " )
49+ parserFactory.fold[ Either [ String , A ]] {
50+ val parsers = allParsers(language, rootProject, reportFile)
51+ withReport(parsers)( s " could not parse report with any parser" )(block )
52+ } { parserFactory =>
53+ val parser = parserFactory(language, rootProject, reportFile)
54+ withReport( Seq (parser))( " could not parse report with the provided parser " )(block )
4555 }
4656 }
4757 }
4858
49- private def create (language : Language .Value , rootProject : File , reportFile : File ): Option [CoverageParser ] = {
50- val implementations =
51- Seq (
52- new CoberturaParser (language, rootProject, reportFile),
53- new JacocoParser (language, rootProject, reportFile )
54- )
59+ private def allParsers (language : Language .Value , rootProject : File , reportFile : File ): Seq [CoverageParser ] = {
60+ Seq (
61+ new CoberturaParser (language, rootProject, reportFile),
62+ new JacocoParser (language, rootProject, reportFile)
63+ )
64+ }
5565
56- implementations.collectFirst {
57- case implementation if implementation.isValidReport =>
58- implementation
59- }
66+ private def withReport [ A ]( parsers : Seq [ CoverageParser ])( errorMessage : String )( block : CoverageReport => A ) : Either [ String , A ] = {
67+ parsers
68+ .find(_.isValidReport)
69+ .fold[ Either [ String , A ]]( Left (errorMessage))(parser => Right (block(parser.generateReport())))
6070 }
6171
6272}
0 commit comments