From 33242654eadb9ff847b501b023f4d8bfc733c010 Mon Sep 17 00:00:00 2001
From: zjc_he <zjc_he@sjtu.edu.cn>
Date: Fri, 24 May 2024 11:04:14 +0800
Subject: [PATCH] init(internal/parsers/cppcheck/) cppcheck

---
 internal/parsers/cppcheck/meta.go   |  9 ++++++
 internal/parsers/cppcheck/parser.go | 48 +++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+)
 create mode 100644 internal/parsers/cppcheck/meta.go
 create mode 100644 internal/parsers/cppcheck/parser.go

diff --git a/internal/parsers/cppcheck/meta.go b/internal/parsers/cppcheck/meta.go
new file mode 100644
index 0000000..b811ad4
--- /dev/null
+++ b/internal/parsers/cppcheck/meta.go
@@ -0,0 +1,9 @@
+package cppcheck
+
+import "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage"
+
+var name = "cppcheck"
+
+func init() {
+	stage.RegisterParser(name, &CppCheck{})
+}
diff --git a/internal/parsers/cppcheck/parser.go b/internal/parsers/cppcheck/parser.go
new file mode 100644
index 0000000..43fc534
--- /dev/null
+++ b/internal/parsers/cppcheck/parser.go
@@ -0,0 +1,48 @@
+package cppcheck
+
+import (
+	"fmt"
+
+	"focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage"
+	"github.com/criyle/go-judge/envexec"
+)
+
+type CppCheck struct{}
+
+type Conf struct {
+	Score   int    `default:"100"`
+	Comment string `default:""`
+}
+
+func Parse(executorResult stage.ExecutorResult, conf Conf) stage.ParserResult {
+	// stdout := executorResult.Files["stdout"]
+	stderr := executorResult.Files["stderr"]
+
+	if executorResult.Status != stage.Status(envexec.StatusAccepted) {
+		return stage.ParserResult{
+			Score: 0,
+			Comment: fmt.Sprintf(
+				"Unexpected executor status: %s.\nStderr: %s",
+				executorResult.Status, stderr,
+			),
+		}
+	}
+	return stage.ParserResult{
+		Score:   0,
+		Comment: "",
+	}
+}
+
+func (*CppCheck) Run(results []stage.ExecutorResult, confAny any) (
+	[]stage.ParserResult, bool, error,
+) {
+	conf, err := stage.DecodeConf[Conf](confAny)
+	if err != nil {
+		return nil, true, err
+	}
+	var res []stage.ParserResult
+	for _, result := range results {
+		res = append(res, Parse(result, *conf))
+	}
+	return res, false, nil
+}