reporterFlag.go•2.5 kB
package lint
import (
	"fmt"
	"strings"
	"github.com/yoheimuta/protolint/internal/linter/report"
	"github.com/yoheimuta/protolint/internal/linter/report/reporters"
)
type reporterFlag struct {
	raw      string
	reporter report.Reporter
}
type reporterStreamFlag struct {
	reporterFlag
	targetFile string
}
type reporterStreamFlags []reporterStreamFlag
func (f *reporterStreamFlag) String() string {
	return fmt.Sprint(f.raw)
}
func (f *reporterStreamFlag) Set(value string) error {
	if f.reporter != nil {
		return fmt.Errorf("reporter is already set")
	}
	valueSplit := strings.SplitN(value, ":", 2)
	if len(valueSplit) != 2 {
		return fmt.Errorf("cannot find output file in %s", value)
	}
	reporterName := valueSplit[0]
	outputFile := valueSplit[1]
	r, err := GetReporter(reporterName)
	if err != nil {
		return err
	}
	f.raw = value
	f.reporter = r
	f.targetFile = outputFile
	return nil
}
func (fs *reporterStreamFlags) String() string {
	var items []string
	for _, flag := range *fs {
		items = append(items, flag.String())
	}
	return strings.Join(items, " ")
}
func (fs *reporterStreamFlags) Set(value string) error {
	var r reporterStreamFlag
	err := r.Set(value)
	if err != nil {
		return err
	}
	*fs = append(*fs, r)
	return nil
}
func (f *reporterFlag) String() string {
	return fmt.Sprint(f.raw)
}
func (f *reporterFlag) Set(value string) error {
	if f.reporter != nil {
		return fmt.Errorf("reporter is already set")
	}
	r, err := GetReporter(value)
	if err != nil {
		return err
	}
	f.raw = value
	f.reporter = r
	return nil
}
// GetReporter returns a reporter from the specified key.
func GetReporter(value string) (report.Reporter, error) {
	rs := map[string]report.Reporter{
		"plain":   reporters.PlainReporter{},
		"junit":   reporters.JUnitReporter{},
		"unix":    reporters.UnixReporter{},
		"json":    reporters.JSONReporter{},
		"sarif":   reporters.SarifReporter{},
		"sonar":   reporters.SonarReporter{},
		"tsc":     reporters.TscReporter{},
		"mcp":     reporters.MCPReporter{},
		"ci":      reporters.NewCiReporterWithGenericFormat(),
		"ci-az":   reporters.NewCiReporterForAzureDevOps(),
		"ci-gh":   reporters.NewCiReporterForGithubActions(),
		"ci-glab": reporters.NewCiReporterForGitlab(),
		"ci-env":  reporters.NewCiReporterFromEnv(),
	}
	if r, ok := rs[value]; ok {
		return r, nil
	}
	return nil, fmt.Errorf(`available reporters are "plain", "junit", "json", "sarif", "unix", "mcp", available reporters for CI/CD are ci, ci-az, ci-gh, ci-glab"`)
}