-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfn-private.go
More file actions
69 lines (52 loc) · 1.02 KB
/
fn-private.go
File metadata and controls
69 lines (52 loc) · 1.02 KB
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
package gokit
import (
"encoding/json"
"reflect"
"github.com/Cyberpull/gokit/errors"
)
func one[T any](def T, attr []T) T {
if len(attr) > 0 {
return attr[0]
}
return def
}
func oneOfAny[T any](def T, attr []any) T {
if len(attr) > 0 {
return attr[0].(T)
}
return def
}
func write(data []byte, output any) (err error) {
defer func() {
r := recover()
if r != nil {
err = errors.From(r)
}
}()
if output == nil {
err = errors.New("Null output is not allowed", 500)
return
}
vtype := reflect.TypeOf(output)
if vtype.Kind() != reflect.Pointer {
err = errors.New("Only pointer output is allowed", 500)
return
}
if err = json.Unmarshal(data, output); err != nil {
err = nil
value := reflect.ValueOf(output).Elem()
switch value.Kind() {
case reflect.String:
value.Set(reflect.ValueOf(string(data)))
return
default:
switch value.Interface().(type) {
case []byte:
value.Set(reflect.ValueOf(data))
return
}
}
err = errors.New("Unable to parse data", 500)
}
return
}