Pure MoonBit toolkit for parsing, validating, filtering and summarizing SARIF 2.1.0 logs
Dependencies
///|
test {
let input =
#|{
#| "version": "2.1.0",
#| "runs": [{
#| "tool": { "driver": { "name": "MoonLint" } },
#| "results": [{
#| "ruleId": "MB001",
#| "level": "warning",
#| "message": { "text": "example finding" }
#| }]
#| }]
#|}
let log = @moonsarif.parse(input)
let report = @moonsarif.validate(log)
let summary = @moonsarif.summarize(log)
assert_true(report.is_valid())
assert_eq(summary.result_count, 1)
}let builder = @moonsarif.LogBuilder::new(tool_name="MoonLint", tool_version="0.4.0")
builder.add_rule(id="MB001")
let index = builder.add_result(
rule_id="MB001",
level="warning",
message=@moonsarif.message_text("unused declaration"),
location=@moonsarif.make_location(uri="src/main.mbt", start_line=12),
)
builder.set_partial_fingerprints(index, { "primaryLocationLineHash": "example" })
let log = builder.finish()moon run cmd/main -- validate examples/sample.sarif --profile generic
moon run cmd/main -- validate examples/sample.sarif --profile github
moon run cmd/main -- validate examples/sample.sarif --profile strict# 检查 SARIF;发现结构/语义错误时退出码为 1
moon run cmd/main -- validate examples/sample.sarif
# 输出统计摘要
moon run cmd/main -- summary examples/sample.sarif --pretty
# 筛选 warning,支持 rule/path 条件
moon run cmd/main -- filter examples/sample.sarif \
--level warning --path src/main.mbt --output filtered.sarif
# 合并多个同版本日志
moon run cmd/main -- merge first.sarif second.sarif --output merged.sarif
# 删除同一日志中的重复结果
moon run cmd/main -- deduplicate merged.sarif --output unique.sarif
# 比较当前结果与历史 baseline;有新增问题时退出码为 3
moon run cmd/main -- baseline current.sarif baseline.sarif --fail-on-new
# 限制新增问题数量
moon run cmd/main -- baseline current.sarif baseline.sarif --max-new 0
# 生成 Markdown 报告
moon run cmd/main -- report examples/sample.sarif --format markdown
# 生成 HTML 报告
moon run cmd/main -- report examples/sample.sarif --format html --output report.html
# 报告中标记 new/unchanged
moon run cmd/main -- report current.sarif --baseline baseline.sarif --format markdown
# 检查 GitHub Code Scanning 常见兼容性问题
moon run cmd/main -- github-check current.sarifmoon fmt
moon check --target all --deny-warn --warn-list +73
moon test --target all --deny-warn
moon infopub struct ArtifactChange {
artifactLocation : ArtifactLocation
replacements : Array[Replacement]
} derive(Eq, ToJson, Debug, FromJson)fn LogBuilder::add_result(self : LogBuilder, rule_id? : String, level? : String, message~ : Message, location? : Location) -> Intfn LogBuilder::add_rule(self : LogBuilder, id~ : String, name? : String, help_uri? : String) -> Unitfn LogBuilder::set_baseline_state(self : LogBuilder, result_index : Int, baseline_state : String) -> Unitfn LogBuilder::set_fingerprints(self : LogBuilder, result_index : Int, fingerprints : Map[String, String]) -> Unitfn LogBuilder::set_locations(self : LogBuilder, result_index : Int, locations : Array[Location]) -> Unitfn LogBuilder::set_partial_fingerprints(self : LogBuilder, result_index : Int, fingerprints : Map[String, String]) -> Unitfn LogBuilder::set_properties(self : LogBuilder, result_index : Int, properties : Map[String, Json]) -> Unitfn LogBuilder::set_related_locations(self : LogBuilder, result_index : Int, locations : Array[Location]) -> Unitfn LogBuilder::set_suppressions(self : LogBuilder, result_index : Int, suppressions : Array[Suppression]) -> Unitpub struct Region {
startLine : Int?
startColumn : Int?
endLine : Int?
endColumn : Int?
snippet : ArtifactContent?
} derive(Eq, ToJson, Debug, FromJson)pub struct Run {
tool : Tool
results : Array[SarifResult]?
automationDetails : RunAutomationDetails?
} derive(Eq, ToJson, Debug, FromJson)pub struct SarifResult {
ruleId : String?
ruleIndex : Int?
level : String?
message : Message
locations : Array[Location]?
relatedLocations : Array[Location]?
partialFingerprints : Map[String, String]?
fingerprints : Map[String, String]?
suppressions : Array[Suppression]?
fixes : Array[Fix]?
properties : Map[String, Json]?
baselineState : String?
} derive(Eq, ToJson, Debug, FromJson)pub struct Tool {
driver : ToolComponent
extensions : Array[ToolComponent]?
} derive(Eq, ToJson, Debug, FromJson)pub struct ValidationIssue {
severity : IssueSeverity
code : String
path : String
message : String
} derive(Eq, ToJson, Debug)fn make_location(uri~ : String, start_line~ : Int, start_column? : Int, end_line? : Int, end_column? : Int) -> Locationfn make_suppression(kind~ : String, justification? : String, location? : Location, guid? : String) -> Suppressionfn normalize_path(input : StringView) -> StringInstall
Download zipPure MoonBit toolkit for parsing, validating, filtering and summarizing SARIF 2.1.0 logs
Dependencies