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 }