-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathto.chan.go
175 lines (167 loc) · 3.92 KB
/
to.chan.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package cast
import (
"reflect"
"github.com/bdlm/errors/v2"
)
// toChan returns a channel of the specified reflect.Value type with a buffer of
// LENGTH containing the from value.
//
// Options:
// - DEFAULT: channel, default return value on error.
// - LENGTH: int, channel buffer size, default 1. Must be greater than or
// equal to 0.
func toChan(to reflect.Value, from any, ops Ops) (any, error) {
var ret any
var ok bool
if _, ok = ops[DEFAULT]; ok {
ret = ops[DEFAULT]
}
size := 1
if _, ok = ops[LENGTH]; ok {
size = To[int](ops[LENGTH])
}
if size < 1 {
return ret, errors.Errorf("invalid channel buffer size %d", size)
}
switch to.Type().Elem().Kind() {
//case reflect.Invalid:
//case reflect.Array:
//case reflect.Func:
//case reflect.Chan:
// return toChan(to.Elem(), from) <- todo: totally explodes, turtles all the way down
//case reflect.Struct:
//case reflect.UnsafePointer:
//case reflect.Map:
//case reflect.Pointer:
//case reflect.Slice:
default:
return ret, errors.Errorf("unable to cast %#.10v of type %T to %T", from, from, to.Interface())
case reflect.Interface:
ret = make(chan interface{}, size)
result, err := ToE[interface{}](from)
if nil != err {
return nil, err
}
ret.(chan interface{}) <- result
case reflect.Bool:
ret = make(chan bool, size)
result, err := ToE[bool](from)
if nil != err {
return nil, err
}
ret.(chan bool) <- result
case reflect.Complex64:
ret = make(chan complex64, size)
result, err := ToE[complex64](from)
if nil != err {
return nil, err
}
ret.(chan complex64) <- result
case reflect.Complex128:
ret = make(chan complex128, size)
result, err := ToE[complex128](from)
if nil != err {
return nil, err
}
ret.(chan complex128) <- result
case reflect.Float32:
ret = make(chan float32, size)
result, err := ToE[float32](from)
if nil != err {
return nil, err
}
ret.(chan float32) <- result
case reflect.Float64:
ret = make(chan float64, size)
result, err := ToE[float64](from)
if nil != err {
return nil, err
}
ret.(chan float64) <- result
case reflect.Int:
ret = make(chan int, size)
result, err := ToE[int](from)
if nil != err {
return nil, err
}
ret.(chan int) <- result
case reflect.Int8:
ret = make(chan int8, size)
result, err := ToE[int8](from)
if nil != err {
return nil, err
}
ret.(chan int8) <- result
case reflect.Int16:
ret = make(chan int16, size)
result, err := ToE[int16](from)
if nil != err {
return nil, err
}
ret.(chan int16) <- result
case reflect.Int32:
ret = make(chan int32, size)
result, err := ToE[int32](from)
if nil != err {
return nil, err
}
ret.(chan int32) <- result
case reflect.Int64:
ret = make(chan int64, size)
result, err := ToE[int64](from)
if nil != err {
return nil, err
}
ret.(chan int64) <- result
case reflect.Uint:
ret = make(chan uint, size)
result, err := ToE[uint](from)
if nil != err {
return nil, err
}
ret.(chan uint) <- result
case reflect.Uint8:
ret = make(chan uint8, size)
result, err := ToE[uint8](from)
if nil != err {
return nil, err
}
ret.(chan uint8) <- result
case reflect.Uint16:
ret = make(chan uint16, size)
result, err := ToE[uint16](from)
if nil != err {
return nil, err
}
ret.(chan uint16) <- result
case reflect.Uint32:
ret = make(chan uint32, size)
result, err := ToE[uint32](from)
if nil != err {
return nil, err
}
ret.(chan uint32) <- result
case reflect.Uint64:
ret = make(chan uint64, size)
result, err := ToE[uint64](from)
if nil != err {
return nil, err
}
ret.(chan uint64) <- result
case reflect.Uintptr:
ret = make(chan uintptr, size)
result, err := ToE[uintptr](from)
if nil != err {
return nil, err
}
ret.(chan uintptr) <- result
case reflect.String:
ret = make(chan string, size)
result, err := ToE[string](from)
if nil != err {
return nil, err
}
ret.(chan string) <- result
}
return ret, nil
}