#97 add As for all interface.
This commit is contained in:
parent
6baf1f2744
commit
2fba1544a7
94
micro.go
Normal file
94
micro.go
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
package micro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
"go.unistack.org/micro/v3/broker"
|
||||||
|
"go.unistack.org/micro/v3/client"
|
||||||
|
"go.unistack.org/micro/v3/codec"
|
||||||
|
"go.unistack.org/micro/v3/flow"
|
||||||
|
"go.unistack.org/micro/v3/fsm"
|
||||||
|
"go.unistack.org/micro/v3/logger"
|
||||||
|
"go.unistack.org/micro/v3/meter"
|
||||||
|
"go.unistack.org/micro/v3/register"
|
||||||
|
"go.unistack.org/micro/v3/resolver"
|
||||||
|
"go.unistack.org/micro/v3/router"
|
||||||
|
"go.unistack.org/micro/v3/selector"
|
||||||
|
"go.unistack.org/micro/v3/server"
|
||||||
|
"go.unistack.org/micro/v3/store"
|
||||||
|
"go.unistack.org/micro/v3/sync"
|
||||||
|
"go.unistack.org/micro/v3/tracer"
|
||||||
|
)
|
||||||
|
|
||||||
|
func As(b any, target any) bool {
|
||||||
|
if b == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if target == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
val := reflect.ValueOf(target)
|
||||||
|
typ := val.Type()
|
||||||
|
if typ.Kind() != reflect.Ptr || val.IsNil() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
targetType := typ.Elem()
|
||||||
|
if targetType.Kind() != reflect.Interface {
|
||||||
|
switch {
|
||||||
|
case targetType.Implements(brokerType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(loggerType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(clientType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(serverType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(codecType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(flowType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(fsmType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(meterType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(registerType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(resolverType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(selectorType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(storeType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(syncType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(serviceType):
|
||||||
|
break
|
||||||
|
case targetType.Implements(routerType):
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if reflect.TypeOf(b).AssignableTo(targetType) {
|
||||||
|
val.Elem().Set(reflect.ValueOf(b))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var brokerType = reflect.TypeOf((*broker.Broker)(nil)).Elem()
|
||||||
|
var loggerType = reflect.TypeOf((*logger.Logger)(nil)).Elem()
|
||||||
|
var clientType = reflect.TypeOf((*client.Client)(nil)).Elem()
|
||||||
|
var serverType = reflect.TypeOf((*server.Server)(nil)).Elem()
|
||||||
|
var codecType = reflect.TypeOf((*codec.Codec)(nil)).Elem()
|
||||||
|
var flowType = reflect.TypeOf((*flow.Flow)(nil)).Elem()
|
||||||
|
var fsmType = reflect.TypeOf((*fsm.FSM)(nil)).Elem()
|
||||||
|
var meterType = reflect.TypeOf((*meter.Meter)(nil)).Elem()
|
||||||
|
var registerType = reflect.TypeOf((*register.Register)(nil)).Elem()
|
||||||
|
var resolverType = reflect.TypeOf((*resolver.Resolver)(nil)).Elem()
|
||||||
|
var routerType = reflect.TypeOf((*router.Router)(nil)).Elem()
|
||||||
|
var selectorType = reflect.TypeOf((*selector.Selector)(nil)).Elem()
|
||||||
|
var storeType = reflect.TypeOf((*store.Store)(nil)).Elem()
|
||||||
|
var syncType = reflect.TypeOf((*sync.Sync)(nil)).Elem()
|
||||||
|
var tracerType = reflect.TypeOf((*tracer.Tracer)(nil)).Elem()
|
||||||
|
var serviceType = reflect.TypeOf((*Service)(nil)).Elem()
|
24
micro_test.go
Normal file
24
micro_test.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package micro
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestAs(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
b any
|
||||||
|
target any
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
// TODO: Add test cases.
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := As(tt.args.b, tt.args.target); got != tt.want {
|
||||||
|
t.Errorf("As() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user