diff --git a/internal/executors/all.go b/internal/executors/all.go index bd860e6..fc0e2b6 100644 --- a/internal/executors/all.go +++ b/internal/executors/all.go @@ -1,6 +1,7 @@ package executors import ( + _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/executors/clang_tidy" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/executors/dummy" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/executors/sandbox" ) diff --git a/internal/executors/clang_tidy/executor.go b/internal/executors/clang_tidy/executor.go new file mode 100644 index 0000000..7e227bf --- /dev/null +++ b/internal/executors/clang_tidy/executor.go @@ -0,0 +1,29 @@ +package clang_tidy + +import ( + "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage" + "github.com/criyle/go-judge/envexec" +) + +type ClangTidy struct{} + +func (e *ClangTidy) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) { + var res []stage.ExecutorResult + for range cmds { + res = append(res, stage.ExecutorResult{ + Status: stage.Status(envexec.StatusInvalid), + ExitStatus: 0, + Error: "I'm a dummy", + Time: 0, + Memory: 0, + RunTime: 0, + Files: map[string]string{}, + FileIDs: map[string]string{}, + }) + } + return res, nil +} + +func (e *ClangTidy) Cleanup() error { + return nil +} diff --git a/internal/executors/clang_tidy/meta.go b/internal/executors/clang_tidy/meta.go new file mode 100644 index 0000000..a8e4fc7 --- /dev/null +++ b/internal/executors/clang_tidy/meta.go @@ -0,0 +1,9 @@ +package clang_tidy + +import "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage" + +var name = "clang-tidy" + +func init() { + stage.RegisterExecutor(name, &ClangTidy{}) +} diff --git a/internal/parsers/all.go b/internal/parsers/all.go index ecc658c..ba5106b 100644 --- a/internal/parsers/all.go +++ b/internal/parsers/all.go @@ -1,6 +1,7 @@ package parsers import ( + _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/clang_tidy" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/diff" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/dummy" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/resultstatus" diff --git a/internal/parsers/clang_tidy/meta.go b/internal/parsers/clang_tidy/meta.go new file mode 100644 index 0000000..ea144c0 --- /dev/null +++ b/internal/parsers/clang_tidy/meta.go @@ -0,0 +1,9 @@ +package clang_tidy + +import "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage" + +var name = "clang-tidy" + +func init() { + stage.RegisterParser(name, &ClangTidy{}) +} diff --git a/internal/parsers/clang_tidy/parser.go b/internal/parsers/clang_tidy/parser.go new file mode 100644 index 0000000..db3300e --- /dev/null +++ b/internal/parsers/clang_tidy/parser.go @@ -0,0 +1,57 @@ +package clang_tidy + +import ( + "encoding/json" + "fmt" + + "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage" + "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/pkg/dummy" + "github.com/criyle/go-judge/envexec" +) + +type Conf struct { + Score int + Comment string +} + +type ClangTidy struct{} + +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, + ), + } + } + var dummyResult dummy.Result + err := json.Unmarshal([]byte(stdout), &dummyResult) + if err != nil { + return stage.ParserResult{ + Score: 0, + Comment: fmt.Sprintf("Failed to parse result: %s", err), + } + } + return stage.ParserResult{ + Score: dummyResult.Score + conf.Score, + Comment: dummyResult.Comment + conf.Comment, + } +} + +func (*ClangTidy) 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 +}