all repos — mx @ master

work in progress MUA

main.go (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
package main

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"strings"

	"git.icyphox.sh/mx/commands"
	"github.com/peterh/liner"
)

var (
	hd, _    = os.UserHomeDir()
	histfile = filepath.Join(hd, ".mx.hist")
)

func main() {
	line := liner.NewLiner()
	defer line.Close()

	line.SetCtrlCAborts(true)

	line.SetCompleter(func(line string) (c []string) {
		for n, _ := range commands.Commands {
			if strings.HasPrefix(n, strings.ToLower(line)) {
				c = append(c, n)
			}
		}
		return
	})

	if f, err := os.Open(histfile); err == nil {
		line.ReadHistory(f)
		f.Close()
	}

	prompt := ""
	for {
		if cmd, err := line.Prompt(prompt + " > "); err == nil {
			commands.ProcessCommands(cmd)
			line.AppendHistory(cmd)
			prompt = cmd
		} else if err == liner.ErrPromptAborted || err == io.EOF {
			fmt.Print("bye!")
			break
		} else {
			fmt.Errorf("error reading line: %+v", err)
		}
	}

	if f, err := os.Create(histfile); err != nil {
		fmt.Errorf("error writing history file: %+v", err)
	} else {
		line.WriteHistory(f)
		f.Close()
	}
}