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  }