JOJ3/cmd/joj3/main.go

74 lines
1.7 KiB
Go

package main
import (
"encoding/json"
"flag"
"log/slog"
"os"
_ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/executors"
_ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers"
"focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage"
"github.com/pelletier/go-toml/v2"
)
func parseConfFile(tomlPath *string) (Conf, []stage.Stage) {
tomlConfig, err := os.ReadFile(*tomlPath)
if err != nil {
slog.Error("read toml config", "error", err)
os.Exit(1)
}
conf := Conf{
LogLevel: 0,
OutputPath: "joj3_result.json",
}
err = toml.Unmarshal(tomlConfig, &conf)
if err != nil {
slog.Error("parse stages config", "error", err)
os.Exit(1)
}
stages := []stage.Stage{}
for _, s := range conf.Stages {
stages = append(stages, stage.Stage{
Name: s.Name,
ExecutorName: s.Executor.Name,
ExecutorCmd: s.Executor.With,
ParserName: s.Parser.Name,
ParserConfig: s.Parser.With,
})
}
return conf, stages
}
func setupSlog(conf Conf) {
lvl := new(slog.LevelVar)
lvl.Set(slog.Level(conf.LogLevel))
opts := &slog.HandlerOptions{Level: lvl}
handler := slog.NewTextHandler(os.Stderr, opts)
logger := slog.New(handler)
slog.SetDefault(logger)
}
func outputResult(conf Conf, results []stage.StageResult) error {
content, err := json.Marshal(results)
if err != nil {
return err
}
return os.WriteFile(conf.OutputPath,
append(content, []byte("\n")...), 0o666)
}
func main() {
tomlPath := flag.String("c", "conf.toml", "file path of the toml config")
flag.Parse()
conf, stages := parseConfFile(tomlPath)
setupSlog(conf)
defer stage.Cleanup()
results := stage.Run(stages)
err := outputResult(conf, results)
if err != nil {
slog.Error("output result", "error", err)
}
}