From 290b614159b8f3445bc8d178ddf8af99f4d5dac4 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Sat, 1 Feb 2025 08:37:36 -0500 Subject: [PATCH] feat(parser/log): new parser --- internal/parser/all.go | 1 + internal/parser/log/meta.go | 9 ++++++ internal/parser/log/parser.go | 52 +++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 internal/parser/log/meta.go create mode 100644 internal/parser/log/parser.go diff --git a/internal/parser/all.go b/internal/parser/all.go index 819bff7..9b511d4 100644 --- a/internal/parser/all.go +++ b/internal/parser/all.go @@ -9,6 +9,7 @@ import ( _ "github.com/joint-online-judge/JOJ3/internal/parser/dummy" _ "github.com/joint-online-judge/JOJ3/internal/parser/healthcheck" _ "github.com/joint-online-judge/JOJ3/internal/parser/keyword" + _ "github.com/joint-online-judge/JOJ3/internal/parser/log" _ "github.com/joint-online-judge/JOJ3/internal/parser/resultdetail" _ "github.com/joint-online-judge/JOJ3/internal/parser/resultstatus" _ "github.com/joint-online-judge/JOJ3/internal/parser/sample" diff --git a/internal/parser/log/meta.go b/internal/parser/log/meta.go new file mode 100644 index 0000000..bb578d1 --- /dev/null +++ b/internal/parser/log/meta.go @@ -0,0 +1,9 @@ +package log + +import "github.com/joint-online-judge/JOJ3/internal/stage" + +var name = "log" + +func init() { + stage.RegisterParser(name, &Log{}) +} diff --git a/internal/parser/log/parser.go b/internal/parser/log/parser.go new file mode 100644 index 0000000..4ea8124 --- /dev/null +++ b/internal/parser/log/parser.go @@ -0,0 +1,52 @@ +package log + +import ( + "encoding/json" + "fmt" + "log/slog" + + "github.com/joint-online-judge/JOJ3/internal/stage" +) + +type Conf struct { + FileName string `default:"stdout"` + Msg string `default:"log msg"` +} + +type Log struct{} + +func Parse(executorResult stage.ExecutorResult, conf Conf) stage.ParserResult { + content := executorResult.Files[conf.FileName] + var data map[string]any + err := json.Unmarshal([]byte(content), &data) + if err != nil { + slog.Error(conf.Msg, "error", err) + return stage.ParserResult{ + Score: 0, + Comment: fmt.Sprintf("Failed to parse content: %s", err), + } + } + args := make([]any, 0, len(data)*2) + for key, value := range data { + args = append(args, key, value) + } + slog.Info(conf.Msg, args...) + return stage.ParserResult{ + Score: 0, + Comment: "", + } +} + +func (*Log) 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 +}