#97 add As for Broker. #298
| @@ -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) {} | ||||||
		Reference in New Issue
	
	Block a user