github.com/adevinta/lava@v0.7.2/cmd/lava/main.go (about)

     1  // Copyright 2023 Adevinta
     2  
     3  // Lava is a tool for running security checks in your local and CI/CD
     4  // environments.
     5  package main
     6  
     7  import (
     8  	"flag"
     9  	"fmt"
    10  	"log/slog"
    11  	"os"
    12  	"strconv"
    13  
    14  	"github.com/fatih/color"
    15  	"github.com/jroimartin/clilog"
    16  
    17  	"github.com/adevinta/lava/cmd/lava/internal/base"
    18  	"github.com/adevinta/lava/cmd/lava/internal/help"
    19  	"github.com/adevinta/lava/cmd/lava/internal/initialize"
    20  	"github.com/adevinta/lava/cmd/lava/internal/run"
    21  	"github.com/adevinta/lava/cmd/lava/internal/scan"
    22  	"github.com/adevinta/lava/cmd/lava/internal/version"
    23  )
    24  
    25  func init() {
    26  	base.Commands = []*base.Command{
    27  		scan.CmdScan,
    28  		run.CmdRun,
    29  		initialize.CmdInit,
    30  		version.CmdVersion,
    31  
    32  		help.HelpEnvironment,
    33  		help.HelpLavaYAML,
    34  		help.HelpMetrics,
    35  	}
    36  }
    37  
    38  func main() {
    39  	h := clilog.NewCLIHandler(os.Stderr, &clilog.HandlerOptions{Level: base.LogLevel})
    40  	slog.SetDefault(slog.New(h))
    41  
    42  	flag.Usage = func() {
    43  		help.PrintUsage(os.Stderr)
    44  	}
    45  	flag.Parse() //nolint:errcheck
    46  
    47  	args := flag.Args()
    48  	if len(args) < 1 {
    49  		help.PrintUsage(os.Stderr)
    50  		os.Exit(2)
    51  	}
    52  
    53  	if err := parseEnv(); err != nil {
    54  		fmt.Fprintf(os.Stderr, "error: %v\n", err)
    55  		os.Exit(2)
    56  	}
    57  
    58  	if args[0] == "help" {
    59  		help.Help(args[1:])
    60  		return
    61  	}
    62  
    63  	for _, cmd := range base.Commands {
    64  		if cmd.Run == nil {
    65  			continue
    66  		}
    67  		cmd.Flag.Usage = cmd.Usage
    68  		if cmd.Name() == args[0] {
    69  			cmd.Flag.Parse(args[1:]) //nolint:errcheck
    70  			args = cmd.Flag.Args()
    71  			if err := cmd.Run(args); err != nil {
    72  				fmt.Fprintf(os.Stderr, "error: %v\n", err)
    73  				os.Exit(1)
    74  			}
    75  			return
    76  		}
    77  	}
    78  
    79  	fmt.Fprintf(os.Stderr, "Unknown command %q. Run \"lava help\".\n", args[0])
    80  	os.Exit(2)
    81  }
    82  
    83  func parseEnv() error {
    84  	if envForceColor := os.Getenv("LAVA_FORCECOLOR"); envForceColor != "" {
    85  		forceColor, err := strconv.ParseBool(envForceColor)
    86  		if err != nil {
    87  			return fmt.Errorf("invalid LAVA_FORCECOLOR value: %v", envForceColor)
    88  		}
    89  		color.NoColor = !forceColor
    90  	}
    91  	return nil
    92  }