package main import ( "path/filepath" "strings" "bufio" "fmt" "io" "os" ) func getBaseConfigDir() (path string) { path = os.Getenv("XDG_CONFIG_HOME") if path != "" { return } path = os.Getenv("APPDATA") if path != "" { return } if os.Getenv("HOME") != "" { return filepath.Join(os.Getenv("HOME"), ".config") } else { return filepath.Join(filepath.Base(os.Args[0]), "config") } } func getConfigDir() string { return filepath.Join(getBaseConfigDir(), "talk") } func (a *application) executeScript(rd io.Reader) error { var ( command strings.Builder br = bufio.NewReader(rd) ) for { command.Reset() command.WriteRune('/') for { c, _, err := br.ReadRune() if err == io.EOF { break } if err != nil { return fmt.Errorf("error reading configuration: %s", err) } if c == '/' && command.Len() == 1 { continue } if c == '\\' { command.WriteRune(c) c, _, _ = br.ReadRune() } else if c == '#' { for c != '\n' { c, _, err = br.ReadRune() if err != nil { break } } } else if c == '\n' { break } command.WriteRune(c) } if strings.TrimSpace(command.String()) != "" { a.processCommand(command.String()) } _, err := br.Peek(1) if err == io.EOF { break } } return nil } func (a *application) executeConfig(name string) error { file, err := os.Open(filepath.Join(getConfigDir(), name)) if err != nil { return fmt.Errorf("error reading configuration: %s", err) } return a.executeScript(file) } func (a *application) executeConfigOptional(name string) (err error) { err = a.executeConfig(name) if os.IsNotExist(err) { return nil } return }