11package errors
22
33import (
4+ "errors"
45 "fmt"
56 "log/slog"
7+ "os"
68 "runtime"
9+
10+ "github.com/nxtcoder17/runfile/types"
711)
812
913type Error struct {
1014 msg string
11- // kv is a slice of slog Attributes i.e. ("key", "value")
12- keys [] string
13- // kv map[string]any
15+
16+ taskName string
17+
1418 kv []any
1519
1620 traces []string
1721
1822 err error
1923}
2024
25+ func (e * Error ) GetWrappedErrorString () string {
26+ if e .err == nil {
27+ return ""
28+ }
29+
30+ return "\n failed with error:\n " + e .err .Error ()
31+ }
32+
33+ func (e * Error ) resolveTaskName () string {
34+ if e .taskName != "" {
35+ return e .taskName
36+ }
37+ for i := 0 ; i < len (e .kv )- 1 ; i += 2 { // assume kv is key/value pairs
38+ if key , ok := e .kv [i ].(string ); ok && key == "task" {
39+ if val , ok := e .kv [i + 1 ].(string ); ok {
40+ return val
41+ }
42+ }
43+ }
44+ return ""
45+ }
46+
2147// Error implements error.
2248func (e * Error ) Error () string {
23- return fmt .Sprintf ("%v {%#v}" , e .err , e .kv )
49+ return e .err .Error ()
50+ // return fmt.Sprintf("%v {%#v}", e.err, e.kv)
51+ }
52+
53+ func (e * Error ) WithTaskName (tn string ) * Error {
54+ e .taskName = tn
55+ return e
56+ }
57+
58+ func (e * Error ) WithCtx (ctx types.Context ) * Error {
59+ return e .WithTaskName (ctx .TaskName )
60+ }
61+
62+ func (e * Error ) GetTaskName () string {
63+ return e .taskName
2464}
2565
2666func (e * Error ) Log () {
67+ fmt .Fprintf (os .Stderr , "%s%s%s\n " , types .GetErrorStyledPrefix (e .resolveTaskName ()), e .msg , e .GetWrappedErrorString ())
68+ if os .Getenv ("RUNFILE_DEBUG" ) == "true" {
69+ e .InspectLog ()
70+ }
71+ }
72+
73+ func (e * Error ) InspectLog () {
2774 args := make ([]any , 0 , len (e .kv ))
2875 args = append (args , e .kv ... )
76+
77+ // b, _ := json.MarshalIndent(e.traces, "", " ")
78+ // args = append(args, "traces", string(b))
79+
2980 args = append (args , "traces" , e .traces )
3081 slog .Error (e .msg , args ... )
3182}
3283
3384var _ error = (* Error )(nil )
3485
3586func Err (msg string ) * Error {
36- return & Error {msg : msg }
87+ _ , file , line , _ := runtime .Caller (1 )
88+ e := & Error {msg : msg }
89+ e .traces = append (e .traces , fmt .Sprintf ("%s:%d" , file , line ))
90+ return e
3791}
3892
3993func (e * Error ) Wrap (err error ) * Error {
4094 _ , file , line , _ := runtime .Caller (1 )
4195 e .traces = append (e .traces , fmt .Sprintf ("%s:%d" , file , line ))
42- e .err = err
96+ if e .err != nil {
97+ e .err = errors .Join (e .err , err )
98+ } else {
99+ e .err = err
100+ }
43101 return e
44102}
45103
46104func (e * Error ) WrapStr (msg string ) * Error {
47- e .err = fmt .Errorf (msg )
105+ if e .err != nil {
106+ e .err = errors .Join (e .err , fmt .Errorf (msg ))
107+ } else {
108+ e .err = fmt .Errorf (msg )
109+ }
48110 return e
49111}
50112
@@ -57,7 +119,12 @@ func (e *Error) KV(kv ...any) *Error {
57119 // // e.keys = append(e.keys, kv[i].(string))
58120 // e.kv[kv[i].(string)] = kv[i+1]
59121 // }
122+ if len (kv ) == 0 {
123+ return e
124+ }
125+ _ , file , line , _ := runtime .Caller (1 )
60126 e .kv = append (e .kv , kv ... )
127+ e .traces = append (e .traces , fmt .Sprintf ("%s:%d" , file , line ))
61128
62129 return e
63130}
@@ -82,9 +149,17 @@ var (
82149 ErrParseDotEnv = Err ("failed to parse dotenv file" )
83150 ErrInvalidDotEnv = Err ("invalid dotenv file" )
84151
85- ErrInvalidEnvVar = Err ("invalid env var" )
86- ErrRequiredEnvVar = Err ("required env var" )
87- ErrInvalidDefaultValue = Err ("invalid default value for env var" )
152+ ErrInvalidEnvVar = func (k string ) * Error {
153+ return Err (fmt .Sprintf ("invalid env var (%s)" , k ))
154+ }
155+
156+ ErrRequiredEnvVar = func (k string ) * Error {
157+ return Err (fmt .Sprintf ("required env var (%s)" , k ))
158+ }
159+
160+ ErrInvalidDefaultValue = func (k string , v any ) * Error {
161+ return Err (fmt .Sprintf ("invalid default value for env var (%s),default: %v" , k , v ))
162+ }
88163
89164 ErrEvalEnvVarSh = Err ("failed while executing env-var sh script" )
90165
0 commit comments