-
Notifications
You must be signed in to change notification settings - Fork 220
/
flyerr.go
129 lines (103 loc) · 2.11 KB
/
flyerr.go
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package flyerr
import (
"context"
"errors"
"fmt"
"github.com/logrusorgru/aurora"
)
type GenericErr struct {
Err string
Descript string
Suggest string
DocUrl string
}
func (e GenericErr) Error() string {
return e.Err
}
func (e GenericErr) FlyDocURL() string {
return e.DocUrl
}
func (e GenericErr) Suggestion() string {
return e.Suggest
}
func (e GenericErr) Description() string {
return e.Descript
}
type FlyDocUrl interface {
DocURL() string
}
func GetErrorDocUrl(err error) string {
var ferr FlyDocUrl
if errors.As(err, &ferr) {
return ferr.DocURL()
}
return ""
}
// ErrAbort is an error for when the CLI aborts
var ErrAbort = errors.New("abort")
// ErrorDescription is an error with a detailed description that will be printed before the CLI exits
type ErrorDescription interface {
error
Description() string
}
func GetErrorDescription(err error) string {
var ferr ErrorDescription
if errors.As(err, &ferr) {
return ferr.Description()
}
return ""
}
// ErrorSuggestion is an error with suggested next steps that will be printed before the CLI exits
type ErrorSuggestion interface {
error
Suggestion() string
}
func GetErrorSuggestion(err error) string {
var ferr ErrorSuggestion
if errors.As(err, &ferr) {
return ferr.Suggestion()
}
return ""
}
func PrintCLIOutput(err error) {
if err == nil {
return
}
if IsCancelledError(err) {
return
}
fmt.Println()
fmt.Println(aurora.Red("Error"), err)
description := GetErrorDescription(err)
suggestion := GetErrorSuggestion(err)
if description != "" {
fmt.Printf("\n\n%s", description)
}
if suggestion != "" {
if description != "" {
fmt.Println()
}
fmt.Printf("\n%s", suggestion)
}
fmt.Println()
}
func IsCancelledError(err error) bool {
if errors.Is(err, ErrAbort) {
return true
}
if errors.Is(err, context.Canceled) {
return true
}
// if err == cmd.ErrAbort {
// return true
// }
// if err == context.Canceled {
// return true
// }
// if merr, ok := err.(*multierror.Error); ok {
// if len(merr.Errors) == 1 && merr.Errors[0] == context.Canceled {
// return true
// }
// }
return false
}