#97 add As for all interface.
This commit is contained in:
parent
0d497ca0df
commit
c09674ae92
@ -1,34 +0,0 @@
|
|||||||
package broker
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
func As(b Broker, 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 && !targetType.Implements(brokerType) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return as(b, val, targetType)
|
|
||||||
}
|
|
||||||
|
|
||||||
func as(b Broker, targetVal reflect.Value, targetType reflect.Type) bool {
|
|
||||||
if reflect.TypeOf(b).AssignableTo(targetType) {
|
|
||||||
targetVal.Elem().Set(reflect.ValueOf(b))
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
var brokerType = reflect.TypeOf((*Broker)(nil)).Elem()
|
|
77
micro.go
Normal file
77
micro.go
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package micro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
"go.unistack.org/micro/v4/broker"
|
||||||
|
"go.unistack.org/micro/v4/client"
|
||||||
|
"go.unistack.org/micro/v4/codec"
|
||||||
|
"go.unistack.org/micro/v4/flow"
|
||||||
|
"go.unistack.org/micro/v4/fsm"
|
||||||
|
"go.unistack.org/micro/v4/logger"
|
||||||
|
"go.unistack.org/micro/v4/meter"
|
||||||
|
"go.unistack.org/micro/v4/register"
|
||||||
|
"go.unistack.org/micro/v4/resolver"
|
||||||
|
"go.unistack.org/micro/v4/router"
|
||||||
|
"go.unistack.org/micro/v4/selector"
|
||||||
|
"go.unistack.org/micro/v4/server"
|
||||||
|
"go.unistack.org/micro/v4/store"
|
||||||
|
"go.unistack.org/micro/v4/sync"
|
||||||
|
"go.unistack.org/micro/v4/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 &&
|
||||||
|
!(targetType.Implements(brokerType) ||
|
||||||
|
targetType.Implements(loggerType) ||
|
||||||
|
targetType.Implements(clientType) ||
|
||||||
|
targetType.Implements(serverType) ||
|
||||||
|
targetType.Implements(codecType) ||
|
||||||
|
targetType.Implements(flowType) ||
|
||||||
|
targetType.Implements(fsmType) ||
|
||||||
|
targetType.Implements(meterType) ||
|
||||||
|
targetType.Implements(registerType) ||
|
||||||
|
targetType.Implements(resolverType) ||
|
||||||
|
targetType.Implements(selectorType) ||
|
||||||
|
targetType.Implements(storeType) ||
|
||||||
|
targetType.Implements(syncType) ||
|
||||||
|
targetType.Implements(tracerType) ||
|
||||||
|
targetType.Implements(serviceType) ||
|
||||||
|
targetType.Implements(routerType)) {
|
||||||
|
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()
|
@ -1,4 +1,4 @@
|
|||||||
package broker
|
package micro
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -6,45 +6,18 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"go.unistack.org/micro/v4/broker"
|
||||||
|
"go.unistack.org/micro/v4/fsm"
|
||||||
"go.unistack.org/micro/v4/options"
|
"go.unistack.org/micro/v4/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
type bro struct {
|
|
||||||
name string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *bro) Name() string { return p.name }
|
|
||||||
func (p *bro) Init(opts ...options.Option) error { return nil }
|
|
||||||
|
|
||||||
// Options returns broker options
|
|
||||||
func (p *bro) Options() Options { return Options{} }
|
|
||||||
|
|
||||||
// Address return configured address
|
|
||||||
func (p *bro) Address() string { return "" }
|
|
||||||
|
|
||||||
// Connect connects to broker
|
|
||||||
func (p *bro) Connect(ctx context.Context) error { return nil }
|
|
||||||
|
|
||||||
// Disconnect disconnect from broker
|
|
||||||
func (p *bro) Disconnect(ctx context.Context) error { return nil }
|
|
||||||
|
|
||||||
// Publish message, msg can be single broker.Message or []broker.Message
|
|
||||||
func (p *bro) Publish(ctx context.Context, msg interface{}, opts ...options.Option) error { return nil }
|
|
||||||
|
|
||||||
// Subscribe subscribes to topic message via handler
|
|
||||||
func (p *bro) Subscribe(ctx context.Context, topic string, handler interface{}, opts ...options.Option) (Subscriber, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String type of broker
|
|
||||||
func (p *bro) String() string { return p.name }
|
|
||||||
|
|
||||||
func TestAs(t *testing.T) {
|
func TestAs(t *testing.T) {
|
||||||
var b *bro
|
var b *bro
|
||||||
broTarget := &bro{name: "kafka"}
|
broTarget := &bro{name: "kafka"}
|
||||||
|
fsmTarget := &fsmT{name: "fsm"}
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
b Broker
|
b any
|
||||||
target any
|
target any
|
||||||
match bool
|
match bool
|
||||||
want any
|
want any
|
||||||
@ -61,6 +34,12 @@ func TestAs(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
nil,
|
nil,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
fsmTarget,
|
||||||
|
&b,
|
||||||
|
false,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for i, tc := range testCases {
|
for i, tc := range testCases {
|
||||||
name := fmt.Sprintf("%d:As(Errorf(..., %v), %v)", i, tc.b, tc.target)
|
name := fmt.Sprintf("%d:As(Errorf(..., %v), %v)", i, tc.b, tc.target)
|
||||||
@ -81,3 +60,44 @@ func TestAs(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type bro struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *bro) Name() string { return p.name }
|
||||||
|
func (p *bro) Init(opts ...options.Option) error { return nil }
|
||||||
|
|
||||||
|
// Options returns broker options
|
||||||
|
func (p *bro) Options() broker.Options { return broker.Options{} }
|
||||||
|
|
||||||
|
// Address return configured address
|
||||||
|
func (p *bro) Address() string { return "" }
|
||||||
|
|
||||||
|
// Connect connects to broker
|
||||||
|
func (p *bro) Connect(ctx context.Context) error { return nil }
|
||||||
|
|
||||||
|
// Disconnect disconnect from broker
|
||||||
|
func (p *bro) Disconnect(ctx context.Context) error { return nil }
|
||||||
|
|
||||||
|
// Publish message, msg can be single broker.Message or []broker.Message
|
||||||
|
func (p *bro) Publish(ctx context.Context, msg interface{}, opts ...options.Option) error { return nil }
|
||||||
|
|
||||||
|
// Subscribe subscribes to topic message via handler
|
||||||
|
func (p *bro) Subscribe(ctx context.Context, topic string, handler interface{}, opts ...options.Option) (broker.Subscriber, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String type of broker
|
||||||
|
func (p *bro) String() string { return p.name }
|
||||||
|
|
||||||
|
type fsmT struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fsmT) Start(ctx context.Context, a interface{}, o ...Option) (interface{}, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
func (f *fsmT) Current() string { return f.name }
|
||||||
|
func (f *fsmT) Reset() {}
|
||||||
|
func (f *fsmT) State(s string, sf fsm.StateFunc) {}
|
Loading…
Reference in New Issue
Block a user