github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/cmd/jsrun/flag.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"strings"
     9  
    10  	"golang.org/x/crypto/ssh/terminal"
    11  
    12  	"github.com/angenalZZZ/gofunc/f"
    13  	"github.com/angenalZZZ/gofunc/js"
    14  	"github.com/angenalZZZ/gofunc/log"
    15  	nat "github.com/angenalZZZ/gofunc/rpc/nats"
    16  )
    17  
    18  var (
    19  	flagConfig = flag.String("c", "jsrun.yaml", "set config file")
    20  	flagDaemon = flag.Bool("d", false, "set as daemons")
    21  )
    22  
    23  func usage() {
    24  	flag.Usage()
    25  	os.Exit(0)
    26  }
    27  
    28  func initArgs() {
    29  	flag.Usage = func() {
    30  		fmt.Printf(" Usage of %s:\n e.g. > jsrun jsrun.js\n", os.Args[0])
    31  		flag.PrintDefaults()
    32  	}
    33  	flag.Parse()
    34  }
    35  
    36  func inputArg() (string, error) {
    37  	args := flag.Args()
    38  	l := len(args)
    39  	if f.StringsContains(args, "-d") {
    40  		f.StringsExclude(args, "-d")
    41  		l--
    42  	}
    43  
    44  	if l > 2 {
    45  		if args[0] == "-c" {
    46  			return args[2], nil
    47  		}
    48  		return args[0], nil
    49  	}
    50  	if l == 2 || l == 0 {
    51  		if terminal.IsTerminal(0) == false {
    52  			buf, err := ioutil.ReadAll(os.Stdin)
    53  			if err != nil {
    54  				return "", err
    55  			}
    56  			return f.String(buf), nil
    57  		}
    58  	}
    59  	if l == 1 {
    60  		return args[0], nil
    61  	}
    62  
    63  	return "", f.ErrBadInput
    64  }
    65  
    66  func checkArgs() {
    67  	if *flagConfig != "" {
    68  		configFile = *flagConfig
    69  	}
    70  
    71  	if err := initConfig(); err != nil {
    72  		panic(err)
    73  	}
    74  
    75  	if log.Log == nil {
    76  		log.Log = log.Init(configInfo.Log)
    77  	}
    78  	if nat.Log == nil {
    79  		nat.Log = log.Log
    80  	}
    81  
    82  	js.RunLogTimeFormat = configInfo.Log.TimeFormat
    83  
    84  	filename, err := inputArg()
    85  	if err != nil {
    86  		exit(err)
    87  	}
    88  	if filename != "" {
    89  		scriptFile = filename
    90  	}
    91  
    92  	// load js
    93  	if strings.HasSuffix(scriptFile, ".js") {
    94  		if isScriptMod() == false {
    95  			usage()
    96  		}
    97  		if err := doScriptMod(); err != nil {
    98  			usage()
    99  		}
   100  	} else {
   101  		configInfo.Script = strings.TrimSpace(scriptFile)
   102  	}
   103  
   104  	if configInfo.Script == "" {
   105  		usage()
   106  	}
   107  
   108  	log.Log.Debug().Msgf("configuration complete.")
   109  }
   110  
   111  func natClientConnect() {
   112  	var err error
   113  
   114  	// NatS
   115  	nat.Subject = "jsrun"
   116  	nat.Conn, err = nat.New("jsrun", configInfo.Nats.Addr, configInfo.Nats.Cred, configInfo.Nats.Token, configInfo.Nats.Cert, configInfo.Nats.Key)
   117  	if err != nil {
   118  		nat.Log.Error().Msgf("[nats] failed connect to server: %v\n", err)
   119  		os.Exit(1)
   120  	}
   121  }
   122  
   123  func run() {
   124  	var r = js.NewRuntime(nil)
   125  	defer func() { r.Clear() }()
   126  	log.Log.Debug().Msg("[js] run started.")
   127  
   128  	if _, err := r.RunString(configInfo.Script); err != nil {
   129  		exit(err)
   130  	}
   131  
   132  	log.Log.Debug().Msg("[js] run finished.")
   133  
   134  	if *flagDaemon == false {
   135  		os.Exit(0)
   136  	}
   137  }
   138  
   139  func exit(err error) {
   140  	nat.Log.Error().Msgf("[js] run error: %v\n", err)
   141  	os.Exit(0)
   142  }