github.com/yoheimuta/protolint@v0.49.8-0.20240515023657-4ecaebb7575d/internal/cmd/subcmds/lint/reporterFlag.go (about) 1 package lint 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/yoheimuta/protolint/internal/linter/report" 8 "github.com/yoheimuta/protolint/internal/linter/report/reporters" 9 ) 10 11 type reporterFlag struct { 12 raw string 13 reporter report.Reporter 14 } 15 16 type reporterStreamFlag struct { 17 reporterFlag 18 targetFile string 19 } 20 21 type reporterStreamFlags []reporterStreamFlag 22 23 func (f *reporterStreamFlag) String() string { 24 return fmt.Sprint(f.raw) 25 } 26 27 func (f *reporterStreamFlag) Set(value string) error { 28 if f.reporter != nil { 29 return fmt.Errorf("reporter is already set") 30 } 31 32 valueSplit := strings.SplitN(value, ":", 2) 33 if len(valueSplit) != 2 { 34 return fmt.Errorf("cannot find output file in %s", value) 35 } 36 37 reporterName := valueSplit[0] 38 outputFile := valueSplit[1] 39 40 r, err := GetReporter(reporterName) 41 if err != nil { 42 return err 43 } 44 45 f.raw = value 46 f.reporter = r 47 f.targetFile = outputFile 48 49 return nil 50 } 51 52 func (fs *reporterStreamFlags) String() string { 53 var items []string 54 for _, flag := range *fs { 55 items = append(items, flag.String()) 56 } 57 58 return strings.Join(items, " ") 59 } 60 61 func (fs *reporterStreamFlags) Set(value string) error { 62 var r reporterStreamFlag 63 err := r.Set(value) 64 if err != nil { 65 return err 66 } 67 68 *fs = append(*fs, r) 69 return nil 70 } 71 72 func (f *reporterFlag) String() string { 73 return fmt.Sprint(f.raw) 74 } 75 76 func (f *reporterFlag) Set(value string) error { 77 if f.reporter != nil { 78 return fmt.Errorf("reporter is already set") 79 } 80 81 r, err := GetReporter(value) 82 if err != nil { 83 return err 84 } 85 f.raw = value 86 f.reporter = r 87 return nil 88 } 89 90 // GetReporter returns a reporter from the specified key. 91 func GetReporter(value string) (report.Reporter, error) { 92 rs := map[string]report.Reporter{ 93 "plain": reporters.PlainReporter{}, 94 "junit": reporters.JUnitReporter{}, 95 "unix": reporters.UnixReporter{}, 96 "json": reporters.JSONReporter{}, 97 "sarif": reporters.SarifReporter{}, 98 "sonar": reporters.SonarReporter{}, 99 "tsc": reporters.TscReporter{}, 100 "ci": reporters.NewCiReporterWithGenericFormat(), 101 "ci-az": reporters.NewCiReporterForAzureDevOps(), 102 "ci-gh": reporters.NewCiReporterForGithubActions(), 103 "ci-glab": reporters.NewCiReporterForGitlab(), 104 "ci-env": reporters.NewCiReporterFromEnv(), 105 } 106 if r, ok := rs[value]; ok { 107 return r, nil 108 } 109 return nil, fmt.Errorf(`available reporters are "plain", "junit", "json", "sarif", and "unix, available reporters for CI/CD are ci, ci-az, ci-gh, ci-glab"`) 110 }