mirror of
https://github.com/usestrix/strix.git
synced 2026-08-19 18:13:34 +02:00
106 lines
3.8 KiB
Go
106 lines
3.8 KiB
Go
package render
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
func renderDependencyReport(args map[string]any, result any) string {
|
|
resultMap, _ := result.(map[string]any)
|
|
// Unsuccessful / not-persisted variants.
|
|
if resultMap != nil {
|
|
success, hasSuccess := resultMap["success"].(bool)
|
|
warning := StringValue(resultMap["warning"])
|
|
if (hasSuccess && !success) || warning != "" {
|
|
return renderDependencyUnsuccessful(args, resultMap)
|
|
}
|
|
}
|
|
var b strings.Builder
|
|
b.WriteString("📦 " + Bold(ReportHdr).Render("Dependency (SCA) Report"))
|
|
field := func(label, value string) {
|
|
if value != "" {
|
|
b.WriteString("\n\n" + Bold(Field).Render(label+": ") + value)
|
|
}
|
|
}
|
|
title := StringValue(args["title"])
|
|
field("Title", title)
|
|
if sev := StringValue(resultMap["severity"]); sev != "" {
|
|
b.WriteString("\n\n" + Bold(Field).Render("Severity: ") +
|
|
lipgloss.NewStyle().Bold(true).Foreground(SeverityColor(sev)).Render(strings.ToUpper(sev)))
|
|
}
|
|
if score, ok := NumericValue(args["advisory_cvss"]); ok {
|
|
b.WriteString("\n\n" + Bold(Field).Render("Advisory CVSS: ") +
|
|
lipgloss.NewStyle().Bold(true).Foreground(CVSSColor(score)).Render(StringValue(args["advisory_cvss"])))
|
|
}
|
|
field("CVE", StringValue(args["cve"]))
|
|
field("CWE", StringValue(args["cwe"]))
|
|
if pkg := StringValue(args["package_name"]); pkg != "" {
|
|
b.WriteString("\n\n" + Bold(Field).Render("Package: ") + Bold(InfoBlue).Render(pkg))
|
|
if eco := StringValue(args["package_ecosystem"]); eco != "" {
|
|
b.WriteString(Dim().Render(" (" + eco + ")"))
|
|
}
|
|
}
|
|
if inst := StringValue(args["installed_version"]); inst != "" {
|
|
b.WriteString("\n\n" + Bold(Field).Render("Installed: ") + Col(Red).Render(inst))
|
|
if fixed := StringValue(args["fixed_version"]); fixed != "" {
|
|
b.WriteString(Dim().Render(" → ") + Bold(Field).Render("Fixed: ") + Col(Green).Render(fixed))
|
|
}
|
|
}
|
|
field("Fix Effort", StringValue(args["fix_effort"]))
|
|
field("Target", StringValue(args["target"]))
|
|
section := func(label, value string) {
|
|
if value != "" {
|
|
b.WriteString("\n\n" + Bold(Field).Render(label) + "\n" + value)
|
|
}
|
|
}
|
|
section("Description", StringValue(args["description"]))
|
|
section("Impact", StringValue(args["impact"]))
|
|
section("Technical Analysis", StringValue(args["technical_analysis"]))
|
|
if reach := StringValue(args["reachability"]); reach != "" && reach != "unknown" {
|
|
b.WriteString("\n\n" + Bold(Field).Render("Usage evidence: ") + reach)
|
|
if ev := StringValue(args["reachability_evidence"]); ev != "" {
|
|
b.WriteString("\n" + ev)
|
|
}
|
|
}
|
|
section("Assumptions", StringValue(args["assumptions"]))
|
|
section("Remediation", StringValue(args["remediation_steps"]))
|
|
if title == "" {
|
|
b.WriteString("\n " + Dim().Render("Creating dependency report..."))
|
|
}
|
|
return "\n\n" + b.String() + "\n\n"
|
|
}
|
|
|
|
func renderDependencyUnsuccessful(args, result map[string]any) string {
|
|
var b strings.Builder
|
|
b.WriteString("📦 " + Bold(ReportHdr).Render("Dependency (SCA) Report"))
|
|
if title := StringValue(args["title"]); title != "" {
|
|
b.WriteString("\n\n" + Bold(Field).Render("Title: ") + title)
|
|
}
|
|
success, hasSuccess := result["success"].(bool)
|
|
var label, detail string
|
|
var style lipgloss.Style
|
|
if hasSuccess && !success {
|
|
detail = StringValue(result["error"])
|
|
if errs, ok := result["errors"].([]any); ok && len(errs) > 0 {
|
|
var parts []string
|
|
for _, e := range errs {
|
|
parts = append(parts, StringValue(e))
|
|
}
|
|
detail = strings.Join(parts, "; ")
|
|
}
|
|
label, style = "✗ Not created: ", Bold(SevCrit)
|
|
if detail == "" {
|
|
detail = "Report was not created."
|
|
}
|
|
} else {
|
|
detail = StringValue(result["warning"])
|
|
label, style = "⚠ Not persisted: ", Bold(SevMed)
|
|
if detail == "" {
|
|
detail = "Report could not be persisted."
|
|
}
|
|
}
|
|
b.WriteString("\n\n" + style.Render(label) + detail)
|
|
return "\n\n" + b.String() + "\n\n"
|
|
}
|