Skip to content

Commit 6c40a48

Browse files
committed
generating clearer aggregated sarif output
1 parent acabb33 commit 6c40a48

File tree

4 files changed

+43
-40
lines changed

4 files changed

+43
-40
lines changed

src/main/scala/org/polystat/cli/EO.scala

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,7 @@ object EO:
6363
cfg.fmts.traverse_ { case OutputFormat.Sarif =>
6464
for
6565
_ <- IO.println(s"Writing aggregated output to $outputPath...")
66-
sariOutput = AggregatedSarifOutput
67-
.fromAnalyzed(analyzed)
68-
.asJson
69-
.deepDropNullValues
70-
.toString
66+
sariOutput = AggregatedSarifOutput(analyzed).json.toString
7167
_ <- writeOutputTo(outputPath)(sariOutput)
7268
yield ()
7369
}
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
package org.polystat.sarif
22

33
import fs2.io.file.Path
4+
import io.circe.Json
5+
import io.circe.syntax.*
46
import org.polystat.odin.analysis.EOOdinAnalyzer.OdinAnalysisResult
7+
import org.polystat.cli.BuildInfo
58

69
import Sarif.*
710

811
case class AggregatedSarifOutput(
912
analyzed: Seq[(Path, List[OdinAnalysisResult])]
10-
)
11-
12-
object AggregatedSarifOutput:
13-
def fromAnalyzed(
14-
analyzed: Seq[(Path, List[OdinAnalysisResult])]
15-
): Seq[SarifLog] =
16-
analyzed.map { case (path, results) =>
17-
SarifOutput(path, results).sarif
18-
}
13+
):
14+
val sarif: SarifLog = SarifLog(
15+
runs = analyzed.map { case (path, errors) =>
16+
SarifOutput.sarifRun(path, errors)
17+
},
18+
version = SARIF_VERSION,
19+
$schema = SARIF_SCHEMA,
20+
)
21+
val json: Json = sarif.asJson.deepDropNullValues
1922
end AggregatedSarifOutput

src/main/scala/org/polystat/sarif/Sarif.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,20 @@ object Sarif:
2020

2121
final case class SarifRun(
2222
tool: SarifTool,
23+
artifacts: Seq[SarifArtifact],
2324
results: Seq[SarifResult],
2425
invocations: Seq[SarifInvocation],
2526
) derives Codec.AsObject
2627

28+
final case class SarifArtifact(
29+
location: SarifArtifactLocation
30+
) derives Codec.AsObject
31+
2732
final case class SarifTool(driver: SarifDriver) derives Codec.AsObject
2833

2934
final case class SarifDriver(
30-
name: String = "Polystat",
31-
informationUri: String = "https://www.polystat.org/",
35+
name: String = "Polystat CLI",
36+
informationUri: String = "https://github.com/nikololiahim/polystat-cli",
3237
semanticVersion: String = BuildInfo.version,
3338
) derives Codec.AsObject
3439

@@ -37,7 +42,7 @@ object Sarif:
3742
level: SarifLevel,
3843
kind: SarifKind,
3944
message: SarifMessage,
40-
locations: Seq[SarifLocation],
45+
locations: Option[Seq[SarifLocation]],
4146
) derives Codec.AsObject
4247

4348
final case class SarifLocation(

src/main/scala/org/polystat/sarif/SarifOutput.scala

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,28 @@ import OdinAnalysisResult.*
1414
import Sarif.*
1515

1616
final case class SarifOutput(filePath: Path, errors: List[OdinAnalysisResult]):
17-
def json: Json = sarif.asJson.deepDropNullValues
18-
19-
private val sarifRun: SarifRun = SarifRun(
20-
SarifTool(SarifDriver()),
21-
results = errors.mapFilter(sarifResult),
22-
invocations = errors.map(sarifInvocation),
23-
)
17+
private val sarifRun: SarifRun = SarifOutput.sarifRun(filePath, errors)
2418

2519
val sarif: SarifLog = SarifLog(Seq(sarifRun))
2620

27-
private def sarifInvocation(
21+
val json: Json = sarif.asJson.deepDropNullValues
22+
23+
end SarifOutput
24+
25+
object SarifOutput:
26+
27+
def sarifRun(filePath: Path, errors: List[OdinAnalysisResult]): SarifRun =
28+
SarifRun(
29+
tool = SarifTool(SarifDriver()),
30+
results = errors.mapFilter(SarifOutput.sarifResult),
31+
invocations = errors.map(SarifOutput.sarifInvocation),
32+
artifacts = Seq(
33+
SarifArtifact(location =
34+
SarifArtifactLocation(uri = filePath.toNioPath.toUri.toString)
35+
)
36+
),
37+
)
38+
def sarifInvocation(
2839
error: OdinAnalysisResult
2940
): SarifInvocation =
3041
error match
@@ -74,7 +85,7 @@ final case class SarifOutput(filePath: Path, errors: List[OdinAnalysisResult]):
7485
executionSuccessful = true,
7586
)
7687

77-
private def sarifResult(error: OdinAnalysisResult): Option[SarifResult] =
88+
def sarifResult(error: OdinAnalysisResult): Option[SarifResult] =
7889
error match
7990
case AnalyzerFailure(_, _) => None
8091
case DefectsDetected(ruleId, message) =>
@@ -84,13 +95,7 @@ final case class SarifOutput(filePath: Path, errors: List[OdinAnalysisResult]):
8495
level = SarifLevel.ERROR,
8596
kind = SarifKind.FAIL,
8697
message = SarifMessage(message.mkString_("\n")),
87-
locations = Seq(
88-
SarifLocation(physicalLocation =
89-
SarifPhysicalLocation(artifactLocation =
90-
SarifArtifactLocation(uri = filePath.toNioPath.toUri.toString)
91-
)
92-
)
93-
),
98+
locations = None,
9499
)
95100
)
96101
case Ok(ruleId) =>
@@ -100,13 +105,7 @@ final case class SarifOutput(filePath: Path, errors: List[OdinAnalysisResult]):
100105
level = SarifLevel.NONE,
101106
kind = SarifKind.PASS,
102107
message = SarifMessage("No errors were found."),
103-
locations = Seq(
104-
SarifLocation(physicalLocation =
105-
SarifPhysicalLocation(artifactLocation =
106-
SarifArtifactLocation(uri = filePath.toNioPath.toUri.toString)
107-
)
108-
)
109-
),
108+
locations = None,
110109
)
111110
)
112111
end SarifOutput

0 commit comments

Comments
 (0)