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 gliba
import (
"fmt"
"github.com/gotk3/gotk3/glib"
)
type Wrapper func(interface{}) (interface{}, bool)
type Unwrapper func(interface{}) (interface{}, bool)
var wrappers []Wrapper
var unwrappers []Unwrapper
func AddWrapper(f Wrapper) {
wrappers = append(wrappers, f)
}
func AddUnwrapper(f Unwrapper) {
unwrappers = append(unwrappers, f)
}
func WrapAllGuard(v interface{}) interface{} {
vv, ok := WrapAll(v)
if !ok {
panic(fmt.Sprintf("Unrecognized type of object: %#v", v))
}
return vv
}
func UnwrapAllGuard(v interface{}) interface{} {
vv, ok := UnwrapAll(v)
if !ok {
panic(fmt.Sprintf("Unrecognized type of object: %#v", v))
}
return vv
}
func WrapAll(v interface{}) (interface{}, bool) {
for _, w := range wrappers {
v1, ok := w(v)
if ok {
return v1, ok
}
}
return nil, false
}
func UnwrapAll(v interface{}) (interface{}, bool) {
for _, u := range unwrappers {
v1, ok := u(v)
if ok {
return v1, ok
}
}
return nil, false
}
func init() {
AddWrapper(WrapPrimitive)
AddWrapper(WrapLocal)
AddUnwrapper(UnwrapPrimitive)
AddUnwrapper(UnwrapLocal)
}
func UnwrapPrimitive(v interface{}) (interface{}, bool) {
if v == nil {
return nil, true
}
switch e := v.(type) {
case bool:
return e, true
case int8:
return e, true
case int64:
return e, true
case int:
return e, true
case uint8:
return e, true
case uint64:
return e, true
case uint:
return e, true
case float32:
return e, true
case float64:
return e, true
case string:
return e, true
}
return nil, false
}
func WrapPrimitive(v interface{}) (interface{}, bool) {
return UnwrapPrimitive(v)
}
func Wrap(o interface{}) interface{} {
v1, ok := WrapLocal(o)
if !ok {
panic(fmt.Sprintf("Unrecognized type of object: %#v", o))
}
return v1
}
func Unwrap(o interface{}) interface{} {
v1, ok := UnwrapLocal(o)
if !ok {
panic(fmt.Sprintf("Unrecognized type of object: %#v", o))
}
return v1
}
func WrapLocal(o interface{}) (interface{}, bool) {
switch oo := o.(type) {
case *glib.Application:
val := WrapApplicationSimple(oo)
if val == nil {
return nil, true
}
return val, true
case *glib.Object:
val := WrapObjectSimple(oo)
if val == nil {
return nil, true
}
return val, true
case *glib.Signal:
val := wrapSignalSimple(oo)
if val == nil {
return nil, true
}
return val, true
case *glib.Value:
val := wrapValueSimple(oo)
if val == nil {
return nil, true
}
return val, true
}
return nil, false
}
func UnwrapLocal(o interface{}) (interface{}, bool) {
switch oo := o.(type) {
case *Application:
val := unwrapApplication(oo)
if val == nil {
return nil, true
}
return val, true
case *Object:
val := unwrapObject(oo)
if val == nil {
return nil, true
}
return val, true
case *signal:
val := unwrapSignal(oo)
if val == nil {
return nil, true
}
return val, true
case *value:
val := unwrapValue(oo)
if val == nil {
return nil, true
}
return val, true
}
return nil, false
}
|