/
utils.go
51 lines (40 loc) · 1.1 KB
/
utils.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
package gobreak
import (
"bytes"
"encoding/gob"
"errors"
"log"
"reflect"
)
var (
ErrNil = errors.New("passed is nil")
ErrNotSlicePtr = errors.New("passed must be slice pointer")
)
func Is(t reflect.Value, k reflect.Kind) bool { return t.Type().Kind() == k }
func IsStrT(t T) bool { return IsStr(reflect.ValueOf(t)) }
func IsStr(t reflect.Value) bool { return Is(t, reflect.String) }
func IsPtrT(t T) bool { return IsPtr(reflect.ValueOf(t)) }
func IsPtr(t reflect.Value) bool { return Is(t, reflect.Ptr) }
func IsSliceT(t T) bool { return IsSlice(reflect.ValueOf(t)) }
func IsSlice(t reflect.Value) bool { return Is(t, reflect.Slice) }
func MustSlicePtr(t T) {
if t == nil {
panic(ErrNil)
}
if v := reflect.ValueOf(t); !IsPtr(v) || !IsSlice(v.Elem()) {
panic(ErrNotSlicePtr)
}
}
func Must(err error) (ok bool) {
if err != nil {
log.Fatalln(err)
}
return true
}
func Clone(dst, src T) error {
var buf bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(src); err != nil {
return err
}
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}