github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/cmd/command/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"io"
     6  	"os"
     7  	"os/signal"
     8  	"strings"
     9  	"syscall"
    10  
    11  	"github.com/easysoft/zendata/cmd/command/action"
    12  	"github.com/easysoft/zendata/internal/command"
    13  	commandConfig "github.com/easysoft/zendata/internal/command/config"
    14  	configUtils "github.com/easysoft/zendata/internal/pkg/config"
    15  	consts "github.com/easysoft/zendata/internal/pkg/const"
    16  	"github.com/easysoft/zendata/internal/pkg/helper"
    17  	fileUtils "github.com/easysoft/zendata/pkg/utils/file"
    18  	logUtils "github.com/easysoft/zendata/pkg/utils/log"
    19  	"github.com/easysoft/zendata/pkg/utils/vari"
    20  	"github.com/fatih/color"
    21  )
    22  
    23  var (
    24  	defaultFile  string
    25  	configFile   string
    26  	exportFields string
    27  
    28  	root  string
    29  	input string
    30  
    31  	parse    bool
    32  	listData bool
    33  	listRes  bool
    34  	view     string
    35  	md5      string
    36  	salt     string
    37  	mock     bool
    38  
    39  	example bool
    40  	help    bool
    41  	version bool
    42  	set     bool
    43  
    44  	AppVersion string
    45  	BuildTime  string
    46  	GoVersion  string
    47  	GitHash    string
    48  
    49  	flagSet *flag.FlagSet
    50  )
    51  
    52  func main() {
    53  	channel := make(chan os.Signal, 1) // fix for sigchanyzer: misuse of unbuffered os.Signal channel as argument to signal.Notify
    54  	signal.Notify(channel, os.Interrupt, syscall.SIGTERM)
    55  	go func() {
    56  		<-channel
    57  		cleanup()
    58  		os.Exit(0)
    59  	}()
    60  
    61  	flagSet = flag.NewFlagSet("zd", flag.ContinueOnError)
    62  
    63  	flagSet.StringVar(&defaultFile, "d", "", "")
    64  	flagSet.StringVar(&defaultFile, "default", "", "")
    65  
    66  	flagSet.StringVar(&configFile, "c", "", "")
    67  	flagSet.StringVar(&configFile, "config", "", "")
    68  
    69  	flagSet.IntVar(&vari.GlobalVars.Total, "n", -1, "")
    70  	flagSet.IntVar(&vari.GlobalVars.Total, "lines", -1, "")
    71  
    72  	flagSet.StringVar(&exportFields, "F", "", "")
    73  	flagSet.StringVar(&exportFields, "field", "", "")
    74  
    75  	flagSet.StringVar(&vari.GlobalVars.OutputFormat, "f", consts.FormatText, "")
    76  	flagSet.StringVar(&vari.GlobalVars.OutputFormat, "format", consts.FormatText, "")
    77  
    78  	flagSet.StringVar(&vari.GlobalVars.Output, "o", "", "")
    79  	flagSet.StringVar(&vari.GlobalVars.Output, "output", "", "")
    80  
    81  	flagSet.BoolVar(&listData, "l", false, "")
    82  	flagSet.BoolVar(&listData, "list", false, "")
    83  	flagSet.BoolVar(&listRes, "L", false, "")
    84  
    85  	flagSet.StringVar(&view, "v", "", "")
    86  	flagSet.StringVar(&view, "view", "", "")
    87  
    88  	flagSet.StringVar(&md5, "md5", "", "")
    89  	flagSet.StringVar(&salt, "salt", "", "")
    90  
    91  	flagSet.BoolVar(&mock, "m", false, "")
    92  
    93  	flagSet.StringVar(&root, "R", "", "")
    94  	flagSet.StringVar(&root, "root", "", "")
    95  
    96  	flagSet.BoolVar(&vari.GlobalVars.Human, "H", false, "")
    97  	flagSet.BoolVar(&vari.GlobalVars.Human, "human", false, "")
    98  
    99  	flagSet.BoolVar(&vari.GlobalVars.Trim, "T", false, "")
   100  	flagSet.BoolVar(&vari.GlobalVars.Trim, "trim", false, "")
   101  
   102  	flagSet.BoolVar(&vari.GlobalVars.Recursive, "r", false, "")
   103  	flagSet.BoolVar(&vari.GlobalVars.Recursive, "recursive", false, "")
   104  
   105  	//flagSet.StringVar(&vari.CacheParam, "C", "", "")
   106  	//flagSet.StringVar(&vari.CacheParam, "cache", "", "")
   107  
   108  	flagSet.BoolVar(&example, "e", false, "")
   109  	flagSet.BoolVar(&example, "example", false, "")
   110  
   111  	flagSet.BoolVar(&set, "S", false, "")
   112  	flagSet.BoolVar(&set, "set", false, "")
   113  
   114  	// gen yaml from sql or table
   115  	flagSet.BoolVar(&parse, "parse", false, "")
   116  
   117  	flagSet.StringVar(&input, "i", "", "")
   118  	flagSet.StringVar(&input, "input", "", "")
   119  
   120  	flagSet.StringVar(&vari.GlobalVars.Table, "t", "", "")
   121  	flagSet.StringVar(&vari.GlobalVars.Table, "table", "", "")
   122  	flagSet.StringVar(&vari.GlobalVars.DBDsn, "dsn", "", "")
   123  	flagSet.StringVar(&vari.GlobalVars.DBType, "db", "db", "")
   124  	flagSet.StringVar(&vari.GlobalVars.DBType, "server", "mysql", "") // TODO: will remove
   125  	flagSet.BoolVar(&vari.GlobalVars.DBClear, "clear", false, "")
   126  
   127  	flagSet.StringVar(&vari.ProtoCls, "cls", "", "")
   128  	flagSet.StringVar(&vari.GlobalVars.MockDir, "mock", "", "")
   129  
   130  	flagSet.BoolVar(&vari.Verbose, "verbose", false, "")
   131  
   132  	flagSet.BoolVar(&help, "h", false, "")
   133  	flagSet.BoolVar(&help, "help", false, "")
   134  	flagSet.BoolVar(&version, "version", false, "")
   135  
   136  	flagSet.Parse(os.Args[1:])
   137  
   138  	ExecCommand()
   139  }
   140  
   141  func ExecCommand() {
   142  	if len(os.Args) == 1 {
   143  		os.Args = append(os.Args, "-help")
   144  	}
   145  
   146  	files, count := fileUtils.GetFilesFromParams(os.Args[1:]) // zd.exe demo\default.yaml demo\test.yaml
   147  	flagSet.Parse(os.Args[1+count:])
   148  	if count == 0 { // not has a def file list, use -d and -c files
   149  		files = []string{defaultFile, configFile}
   150  	}
   151  
   152  	configUtils.InitConfig(root)
   153  	vari.DB, _ = commandConfig.NewGormDB()
   154  	//defer vari.DB.Close()
   155  
   156  	flagSet.SetOutput(io.Discard)
   157  	if err := flagSet.Parse(os.Args[1:]); err == nil {
   158  		opts(files)
   159  	} else {
   160  		logUtils.PrintUsage()
   161  	}
   162  }
   163  
   164  func opts(files []string) {
   165  	if exportFields != "" {
   166  		vari.GlobalVars.ExportFields = strings.Split(exportFields, ",")
   167  	}
   168  
   169  	if version {
   170  		logUtils.PrintVersion(AppVersion, BuildTime, GoVersion, GitHash)
   171  		return
   172  
   173  	} else if help {
   174  		logUtils.PrintUsage()
   175  		return
   176  	} else if example {
   177  		logUtils.PrintExample()
   178  		return
   179  	} else if set {
   180  		helper.Set()
   181  		return
   182  	} else if listData {
   183  		helper.ListData()
   184  		return
   185  	} else if listRes {
   186  		helper.ListRes()
   187  		return
   188  	} else if view != "" {
   189  		helper.View(view)
   190  		return
   191  	} else if md5 != "" {
   192  		helper.AddMd5(md5, salt)
   193  		return
   194  	} else if parse {
   195  		action.GenYaml(input)
   196  		return
   197  	} else if mock {
   198  		if input == "" {
   199  			return
   200  		}
   201  		genMock(input)
   202  
   203  		return
   204  	}
   205  
   206  	action.GenData(files)
   207  }
   208  
   209  func genMock(input string) {
   210  	mainCtrl, _ := command.InitCtrl()
   211  	mainCtrl.GenMock(input)
   212  }
   213  
   214  func init() {
   215  	cleanup()
   216  }
   217  
   218  func cleanup() {
   219  	color.Unset()
   220  }