github.com/zhaobingss/air@v1.49.1/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"os/signal"
     9  	"runtime"
    10  	"runtime/debug"
    11  	"syscall"
    12  
    13  	"github.com/zhaobingss/air/runner"
    14  )
    15  
    16  var (
    17  	cfgPath     string
    18  	debugMode   bool
    19  	showVersion bool
    20  	cmdArgs     map[string]runner.TomlInfo
    21  )
    22  
    23  func helpMessage() {
    24  	fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n\n", os.Args[0])
    25  	fmt.Printf("If no command is provided %s will start the runner with the provided flags\n\n", os.Args[0])
    26  	fmt.Println("Commands:")
    27  	fmt.Print("  init	creates a .air.toml file with default settings to the current directory\n\n")
    28  
    29  	fmt.Println("Flags:")
    30  	flag.PrintDefaults()
    31  }
    32  
    33  func init() {
    34  	parseFlag(os.Args[1:])
    35  }
    36  
    37  func parseFlag(args []string) {
    38  	flag.Usage = helpMessage
    39  	flag.StringVar(&cfgPath, "c", "", "config path")
    40  	flag.BoolVar(&debugMode, "d", false, "debug mode")
    41  	flag.BoolVar(&showVersion, "v", false, "show version")
    42  	cmd := flag.CommandLine
    43  	cmdArgs = runner.ParseConfigFlag(cmd)
    44  	if err := flag.CommandLine.Parse(args); err != nil {
    45  		log.Fatal(err)
    46  	}
    47  }
    48  
    49  type versionInfo struct {
    50  	airVersion string
    51  	goVersion  string
    52  }
    53  
    54  func GetVersionInfo() versionInfo { //revive:disable:unexported-return
    55  	if len(airVersion) != 0 && len(goVersion) != 0 {
    56  		return versionInfo{
    57  			airVersion: airVersion,
    58  			goVersion:  goVersion,
    59  		}
    60  	}
    61  	if info, ok := debug.ReadBuildInfo(); ok {
    62  		return versionInfo{
    63  			airVersion: info.Main.Version,
    64  			goVersion:  runtime.Version(),
    65  		}
    66  	}
    67  	return versionInfo{
    68  		airVersion: "(unknown)",
    69  		goVersion:  runtime.Version(),
    70  	}
    71  }
    72  
    73  func main() {
    74  	versionInfo := GetVersionInfo()
    75  	fmt.Printf(`
    76    __    _   ___  
    77   / /\  | | | |_) 
    78  /_/--\ |_| |_| \_ %s, built with Go %s
    79  
    80  `, versionInfo.airVersion, versionInfo.goVersion)
    81  
    82  	if showVersion {
    83  		return
    84  	}
    85  
    86  	if debugMode {
    87  		fmt.Println("[debug] mode")
    88  	}
    89  	sigs := make(chan os.Signal, 1)
    90  	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
    91  
    92  	var err error
    93  	cfg, err := runner.InitConfig(cfgPath)
    94  	if err != nil {
    95  		log.Fatal(err)
    96  		return
    97  	}
    98  	cfg.WithArgs(cmdArgs)
    99  	r, err := runner.NewEngineWithConfig(cfg, debugMode)
   100  	if err != nil {
   101  		log.Fatal(err)
   102  		return
   103  	}
   104  	go func() {
   105  		<-sigs
   106  		r.Stop()
   107  	}()
   108  
   109  	defer func() {
   110  		if e := recover(); e != nil {
   111  			log.Fatalf("PANIC: %+v", e)
   112  		}
   113  	}()
   114  
   115  	r.Run()
   116  }