error.go 1.2 KB
Newer Older
LinuxSuRen's avatar
LinuxSuRen 已提交
1 2
package helper

3 4 5 6 7 8 9 10 11 12
import (
	"fmt"
	"net/url"
	"os"
	"strings"
)

// Printer for print the info
type Printer interface {
	PrintErr(i ...interface{})
13 14
	Println(i ...interface{})
	Printf(format string, i ...interface{})
15
}
LinuxSuRen's avatar
LinuxSuRen 已提交
16 17

// CheckErr print a friendly error message
18
func CheckErr(printer Printer, err error) {
LinuxSuRen's avatar
LinuxSuRen 已提交
19 20 21 22
	switch {
	case err == nil:
		return
	default:
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
		msg, ok := StandardErrorMessage(err)
		if !ok {
			msg = err.Error()
			if !strings.HasPrefix(msg, "error: ") {
				msg = fmt.Sprintf("error: %s", msg)
			}
		}
		printer.PrintErr(msg)
	}
}

// StandardErrorMessage is generic to the command in use
func StandardErrorMessage(err error) (msg string, ok bool) {
	ok = true
	switch t := err.(type) {
	case url.InvalidHostError:
		msg = t.Error()
	case *url.Error:
		switch {
		case strings.Contains(t.Err.Error(), "connection refused"):
			host := t.URL
			if server, err := url.Parse(t.URL); err == nil {
				host = server.Host
			}
			msg = fmt.Sprintf("The connection to the server %s was refused - did you specify the right host or port?", host)
		default:
			msg = fmt.Sprintf("Unable to connect to the server: %v", t.Err)
		}
	case *os.PathError:
		msg = fmt.Sprintf("error: %s %s: %s", t.Op, t.Path, t.Err)
	default:
		ok = false
LinuxSuRen's avatar
LinuxSuRen 已提交
55
	}
56
	return
LinuxSuRen's avatar
LinuxSuRen 已提交
57
}