As for interface casting
Co-authored-by: Gorbunov Kirill Andreevich <kgorbunov@mtsbank.ru> Reviewed-on: #299 Co-authored-by: Кирилл Горбунов <kirya_gorbunov_2015@mail.ru> Co-committed-by: Кирилл Горбунов <kirya_gorbunov_2015@mail.ru>
This commit was merged in pull request #299.
	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() | ||||
		Reference in New Issue
	
	Block a user