feat!: support multiple parsers in one stage (#52)

This commit is contained in:
张泊明518370910136 2024-10-09 18:50:06 -04:00
parent 9f17bb317d
commit 6620f9bc28
GPG Key ID: D47306D7062CDA9D
4 changed files with 67 additions and 36 deletions

View File

@ -30,7 +30,7 @@ type Conf struct {
Cases []OptionalCmd Cases []OptionalCmd
} }
} }
Parser struct { Parsers []struct {
Name string Name string
With interface{} With interface{}
} }

View File

@ -16,7 +16,7 @@ import (
func generateStages(conf conf.Conf, group string) ([]stage.Stage, error) { func generateStages(conf conf.Conf, group string) ([]stage.Stage, error) {
stages := []stage.Stage{} stages := []stage.Stage{}
existNames := map[string]bool{} existNames := map[string]bool{}
for _, s := range conf.Stages { for _, s := range conf.Stage.Stages {
if s.Group != "" && group != s.Group { if s.Group != "" && group != s.Group {
continue continue
} }
@ -50,12 +50,20 @@ func generateStages(conf conf.Conf, group string) ([]stage.Stage, error) {
if len(s.Executor.With.Cases) == 0 { if len(s.Executor.With.Cases) == 0 {
cmds = []stage.Cmd{defaultCmd} cmds = []stage.Cmd{defaultCmd}
} }
parsers := []stage.StageParser{}
for _, p := range s.Parsers {
parsers = append(parsers, stage.StageParser{
Name: p.Name,
Conf: p.With,
})
}
stages = append(stages, stage.Stage{ stages = append(stages, stage.Stage{
Name: s.Name, Name: s.Name,
ExecutorName: s.Executor.Name, Executor: stage.StageExecutor{
ExecutorCmds: cmds, Name: s.Executor.Name,
ParserName: s.Parser.Name, Cmds: cmds,
ParserConf: s.Parser.With, },
Parsers: parsers,
}) })
} }
slog.Debug("stages generated", "stages", stages) slog.Debug("stages generated", "stages", stages)

View File

@ -150,12 +150,19 @@ func (r ExecutorResult) String() string {
return fmt.Sprintf("%+v", d) return fmt.Sprintf("%+v", d)
} }
type StageExecutor struct {
Name string
Cmds []Cmd
}
type StageParser struct {
Name string
Conf any
}
type Stage struct { type Stage struct {
Name string Name string
ExecutorName string Executor StageExecutor
ExecutorCmds []Cmd Parsers []StageParser
ParserName string
ParserConf any
} }
type ParserResult struct { type ParserResult struct {

View File

@ -8,51 +8,67 @@ import (
func Run(stages []Stage) (stageResults []StageResult, err error) { func Run(stages []Stage) (stageResults []StageResult, err error) {
var executorResults []ExecutorResult var executorResults []ExecutorResult
var parserResults []ParserResult var parserResults []ParserResult
var tmpParserResults []ParserResult
var forceQuit bool var forceQuit bool
slog.Info("stage run start") slog.Info("stage run start")
for _, stage := range stages { for _, stage := range stages {
slog.Info("stage start", "name", stage.Name) slog.Info("stage start", "name", stage.Name)
slog.Info("executor run start", "name", stage.ExecutorName) slog.Info("executor run start", "name", stage.Executor.Name)
slog.Debug("executor run start", "name", stage.ExecutorName, slog.Debug("executor run start", "name", stage.Executor.Name,
"cmds", stage.ExecutorCmds) "cmds", stage.Executor.Cmds)
executor, ok := executorMap[stage.ExecutorName] executor, ok := executorMap[stage.Executor.Name]
if !ok { if !ok {
slog.Error("executor not found", "name", stage.ExecutorName) slog.Error("executor not found", "name", stage.Executor.Name)
err = fmt.Errorf("executor not found: %s", stage.ExecutorName) err = fmt.Errorf("executor not found: %s", stage.Executor.Name)
return return
} }
executorResults, err = executor.Run(stage.ExecutorCmds) executorResults, err = executor.Run(stage.Executor.Cmds)
if err != nil { if err != nil {
slog.Error("executor run error", "name", stage.ExecutorName, "error", err) slog.Error("executor run error", "name", stage.Executor.Name, "error", err)
return return
} }
slog.Debug("executor run done", "results", executorResults) slog.Debug("executor run done", "results", executorResults)
for _, executorResult := range executorResults { for _, executorResult := range executorResults {
slog.Debug("executor run done", "result.Files", executorResult.Files) slog.Debug("executor run done", "result.Files", executorResult.Files)
} }
slog.Info("parser run start", "name", stage.ParserName) parserResults = []ParserResult{}
slog.Debug("parser run start", "name", stage.ParserName, for _, stageParser := range stage.Parsers {
"conf", stage.ParserConf) slog.Info("parser run start", "name", stageParser.Name)
parser, ok := parserMap[stage.ParserName] slog.Debug("parser run start", "name", stageParser.Name,
"conf", stageParser.Conf)
parser, ok := parserMap[stageParser.Name]
if !ok { if !ok {
slog.Error("parser not found", "name", stage.ParserName) slog.Error("parser not found", "name", stageParser.Name)
err = fmt.Errorf("parser not found: %s", stage.ParserName) err = fmt.Errorf("parser not found: %s", stageParser.Name)
return return
} }
parserResults, forceQuit, err = parser.Run(executorResults, stage.ParserConf) tmpParserResults, forceQuit, err = parser.Run(
executorResults, stageParser.Conf)
if err != nil { if err != nil {
slog.Error("parser run error", "name", stage.ParserName, "error", err) slog.Error("parser run error", "name", stageParser.Name, "error", err)
return return
} }
slog.Debug("parser run done", "results", parserResults) slog.Debug("parser run done", "results", tmpParserResults)
if len(parserResults) == 0 {
parserResults = tmpParserResults
} else {
for i := range len(parserResults) {
parserResults[i].Score += tmpParserResults[i].Score
parserResults[i].Comment += tmpParserResults[i].Comment
}
}
if forceQuit {
slog.Error("parser force quit", "name", stageParser.Name)
break
}
}
stageResults = append(stageResults, StageResult{ stageResults = append(stageResults, StageResult{
Name: stage.Name, Name: stage.Name,
Results: parserResults, Results: parserResults,
ForceQuit: forceQuit, ForceQuit: forceQuit,
}) })
if forceQuit { if forceQuit {
slog.Error("parser force quit", "name", stage.ParserName) break
return
} }
} }
return return