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  }