#97 add As for all interface.
This commit is contained in:
		
							
								
								
									
										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) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user