github.com/julianthome/gore@v0.0.0-20231109011145-b3a6bbe6fe55/cli/cli.go (about)

     1  package cli
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"io"
     7  	"runtime"
     8  
     9  	"github.com/x-motemen/gore"
    10  )
    11  
    12  var revision = "HEAD"
    13  
    14  const (
    15  	exitCodeOK = iota
    16  	exitCodeErr
    17  )
    18  
    19  type cli struct {
    20  	outWriter, errWriter io.Writer
    21  }
    22  
    23  func (c *cli) run(args []string) int {
    24  	g, err := c.parseArgs(args)
    25  	if err != nil {
    26  		if err != flag.ErrHelp {
    27  			return exitCodeErr
    28  		}
    29  		return exitCodeOK
    30  	}
    31  	if err := g.Run(); err != nil {
    32  		fmt.Fprintf(c.errWriter, "gore: %s\n", err)
    33  		return exitCodeErr
    34  	}
    35  	return exitCodeOK
    36  }
    37  
    38  func (c *cli) parseArgs(args []string) (*gore.Gore, error) {
    39  	fs := flag.NewFlagSet("gore", flag.ContinueOnError)
    40  	fs.SetOutput(c.errWriter)
    41  	fs.Usage = func() {
    42  		fs.SetOutput(c.outWriter)
    43  		defer fs.SetOutput(c.errWriter)
    44  		fmt.Fprintf(c.outWriter, `gore - A Go REPL
    45  
    46  Version: %s (rev: %s/%s)
    47  
    48  Synopsis:
    49      %% gore
    50  
    51  Options:
    52  `, gore.Version, revision, runtime.Version())
    53  		fs.PrintDefaults()
    54  	}
    55  
    56  	var autoImport bool
    57  	fs.BoolVar(&autoImport, "autoimport", false, "formats and adjusts imports automatically")
    58  
    59  	var extFiles string
    60  	fs.StringVar(&extFiles, "context", "", "import packages, functions, variables and constants from external golang source files")
    61  
    62  	var packageName string
    63  	fs.StringVar(&packageName, "pkg", "", "the package where the session will be run inside")
    64  
    65  	var showVersion bool
    66  	fs.BoolVar(&showVersion, "version", false, "print gore version")
    67  
    68  	err := fs.Parse(args)
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  
    73  	if showVersion {
    74  		fmt.Fprintf(c.outWriter, "gore %s (rev: %s/%s)\n", gore.Version, revision, runtime.Version())
    75  		return nil, flag.ErrHelp
    76  	}
    77  
    78  	return gore.New(
    79  		gore.AutoImport(autoImport),
    80  		gore.ExtFiles(extFiles),
    81  		gore.PackageName(packageName),
    82  		gore.OutWriter(c.outWriter),
    83  		gore.ErrWriter(c.errWriter),
    84  	), nil
    85  }