/
base.go
106 lines (92 loc) · 1.65 KB
/
base.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
package u
import (
"fmt"
"runtime"
"strconv"
"strings"
)
func Must(err error) {
if err != nil {
panic(err)
}
}
func Must2[T any](x T, err error) T {
if err != nil {
panic(err)
}
return x
}
func PanicIf(cond bool, args ...interface{}) {
if !cond {
return
}
s := "condition failed"
if len(args) > 0 {
s = fmt.Sprintf("%s", args[0])
if len(args) > 1 {
s = fmt.Sprintf(s, args[1:]...)
}
}
panic(s)
}
func PanicIfErr(err error, args ...interface{}) {
if err == nil {
return
}
s := err.Error()
if len(args) > 0 {
s = fmt.Sprintf("%s", args[0])
if len(args) > 1 {
s = fmt.Sprintf(s, args[1:]...)
}
}
panic(s)
}
func GetErr(errs ...error) error {
for _, err := range errs {
if err != nil {
return err
}
}
return nil
}
func IsWindows() bool {
return strings.Contains(runtime.GOOS, "windows")
}
func IsMac() bool {
return strings.Contains(runtime.GOOS, "darwin")
}
func IsWinOrMac() bool {
return IsWindows() || IsMac()
}
func IsLinux() bool {
return strings.Contains(runtime.GOOS, "linux")
}
func GetCallstackFrames(skipFrames int) []string {
var callers [32]uintptr
n := runtime.Callers(skipFrames+1, callers[:])
frames := runtime.CallersFrames(callers[:n])
var cs []string
for {
frame, more := frames.Next()
if !more {
break
}
s := frame.File + ":" + strconv.Itoa(frame.Line)
cs = append(cs, s)
}
return cs
}
func GetCallstack(skipFrames int) string {
frames := GetCallstackFrames(skipFrames + 1)
return strings.Join(frames, "\n")
}
func Push[S ~[]E, E any](s *S, els ...E) {
*s = append(*s, els...)
}
func SliceLimit[S ~[]E, E any](s S, max int) S {
if len(s) > max {
return s[:max]
}
return s
}