github.com/julianthome/gore@v0.0.0-20231109011145-b3a6bbe6fe55/gore.go (about) 1 package gore 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "path/filepath" 8 "strings" 9 ) 10 11 // Version of gore. 12 const Version = "0.5.7" 13 14 // Gore ... 15 type Gore struct { 16 autoImport bool 17 extFiles string 18 packageName string 19 outWriter, errWriter io.Writer 20 defaultPrompt string 21 Session *Session 22 } 23 24 // New Gore 25 func New(opts ...Option) *Gore { 26 g := &Gore{outWriter: os.Stdout, errWriter: os.Stderr} 27 for _, opt := range opts { 28 opt(g) 29 } 30 31 s, err := NewSession(g.outWriter, g.errWriter) 32 if err != nil { 33 panic(err) 34 } 35 g.Session = s 36 37 return g 38 } 39 40 // Run ... 41 func (g *Gore) Run() error { 42 //s, err := NewSession(g.outWriter, g.errWriter) 43 defer g.Session.Clear() 44 45 s := g.Session 46 s.autoImport = g.autoImport 47 48 //fmt.Fprintf(g.errWriter, "gore version %s :help for help\n", Version) 49 50 if g.extFiles != "" { 51 extFiles := strings.Split(g.extFiles, ",") 52 s.includeFiles(extFiles) 53 } 54 55 if g.packageName != "" { 56 if err := s.includePackage(g.packageName); err != nil { 57 return err 58 } 59 } 60 61 rl := newContLiner(g.defaultPrompt) 62 defer rl.Close() 63 64 var historyFile string 65 home, err := homeDir() 66 if err != nil { 67 errorf("home: %s", err) 68 } else { 69 historyFile = filepath.Join(home, "history") 70 71 f, err := os.Open(historyFile) 72 if err != nil { 73 if !os.IsNotExist(err) { 74 errorf("%s", err) 75 } 76 } else { 77 _, err := rl.ReadHistory(f) 78 if err != nil { 79 errorf("while reading history: %s", err) 80 } 81 f.Close() 82 } 83 } 84 85 rl.SetWordCompleter(s.completeWord) 86 87 for { 88 in, err := rl.Prompt() 89 if err != nil { 90 if err == io.EOF { 91 break 92 } 93 return err 94 } 95 96 if in == "" { 97 continue 98 } 99 100 if err := rl.Reindent(); err != nil { 101 fmt.Fprintf(g.errWriter, "error: %s\n", err) 102 rl.Clear() 103 continue 104 } 105 106 err = s.Eval(in) 107 if err != nil { 108 if err == ErrContinue { 109 continue 110 } else if err == ErrQuit { 111 break 112 } else if err != ErrCmdRun { 113 rl.Clear() 114 continue 115 } 116 } 117 rl.Accepted() 118 } 119 120 if historyFile != "" { 121 err := os.MkdirAll(filepath.Dir(historyFile), 0o755) 122 if err != nil { 123 errorf("%s", err) 124 } else { 125 f, err := os.Create(historyFile) 126 if err != nil { 127 errorf("%s", err) 128 } else { 129 _, err := rl.WriteHistory(f) 130 if err != nil { 131 errorf("while saving history: %s", err) 132 } 133 f.Close() 134 } 135 } 136 } 137 138 return nil 139 } 140 141 func homeDir() (home string, err error) { 142 home = os.Getenv("GORE_HOME") 143 if home != "" { 144 return 145 } 146 147 home, err = os.UserHomeDir() 148 if err != nil { 149 return 150 } 151 152 home = filepath.Join(home, ".gore") 153 return 154 }