ing
This commit is contained in:
		
							parent
							
								
									dc9f7bce0a
								
							
						
					
					
						commit
						c896f9da22
					
				| @ -16,7 +16,7 @@ type TypeDefinition struct { | |||||||
| 	RealType reflect.Type | 	RealType reflect.Type | ||||||
| 
 | 
 | ||||||
| 	TypeAnnotations   map[string]cda.Annotation | 	TypeAnnotations   map[string]cda.Annotation | ||||||
| 	MethodAnnotations map[string]cda.Annotation | 	MethodAnnotations map[string]map[string]cda.Annotation | ||||||
| 	Fields            []*FieldDefinition | 	Fields            []*FieldDefinition | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -48,6 +48,25 @@ func (td *TypeDefinition) GetAnnotationByType(at reflect.Type, includeEmbedding | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (td *TypeDefinition) GetMethodAnnotationByType(at reflect.Type, methodName string) cda.Annotation { | ||||||
|  | 	if nil == td.MethodAnnotations { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ms, ok := td.MethodAnnotations[methodName] | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, v := range ms { | ||||||
|  | 		if at == reflect.TypeOf(v) { | ||||||
|  | 			return v | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func checkAnnotation(t reflect.Type, st reflect.Type) bool { | func checkAnnotation(t reflect.Type, st reflect.Type) bool { | ||||||
| 	rt, _, _ := cur.GetTypeInfo(t) | 	rt, _, _ := cur.GetTypeInfo(t) | ||||||
| 	if reflect.Struct != rt.Kind() { | 	if reflect.Struct != rt.Kind() { | ||||||
|  | |||||||
| @ -27,6 +27,9 @@ type ComponentRegistry interface { | |||||||
| 	GetInstanceByName(name string) (interface{}, error) | 	GetInstanceByName(name string) (interface{}, error) | ||||||
| 	// GetInstancesByAnnotationName(n string) ([]interface{}, error) | 	// GetInstancesByAnnotationName(n string) ([]interface{}, error) | ||||||
| 	GetInstancesByAnnotationType(t reflect.Type) ([]interface{}, error) | 	GetInstancesByAnnotationType(t reflect.Type) ([]interface{}, error) | ||||||
|  | 
 | ||||||
|  | 	GetTypeAnnotation(instanceType reflect.Type, annotationType reflect.Type) cda.Annotation | ||||||
|  | 	GetMethodAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) cda.Annotation | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newRegistry() ComponentRegistry { | func newRegistry() ComponentRegistry { | ||||||
| @ -259,6 +262,29 @@ func (cr *defaultComponentRegistry) GetInstancesByAnnotationType(t reflect.Type) | |||||||
| 	return instances, nil | 	return instances, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func GetTypeAnnotation(instanceType reflect.Type, annotationType reflect.Type) cda.Annotation { | ||||||
|  | 	return registry.GetTypeAnnotation(instanceType, annotationType) | ||||||
|  | } | ||||||
|  | func (cr *defaultComponentRegistry) GetTypeAnnotation(instanceType reflect.Type, annotationType reflect.Type) cda.Annotation { | ||||||
|  | 	def, ok := cr.definitionByType[instanceType] | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return def.GetAnnotationByType(annotationType, false) | ||||||
|  | } | ||||||
|  | func GetMethodAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) cda.Annotation { | ||||||
|  | 	return registry.GetMethodAnnotation(instanceType, annotationType, methodName) | ||||||
|  | } | ||||||
|  | func (cr *defaultComponentRegistry) GetMethodAnnotation(instanceType reflect.Type, annotationType reflect.Type, methodName string) cda.Annotation { | ||||||
|  | 	def, ok := cr.definitionByType[instanceType] | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return def.GetMethodAnnotationByType(annotationType, methodName) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (cr *defaultComponentRegistry) buildDefinition(t reflect.Type) (*TypeDefinition, error) { | func (cr *defaultComponentRegistry) buildDefinition(t reflect.Type) (*TypeDefinition, error) { | ||||||
| 	if nil == t { | 	if nil == t { | ||||||
| 		return nil, fmt.Errorf("t[reflect.Type] is nil") | 		return nil, fmt.Errorf("t[reflect.Type] is nil") | ||||||
| @ -350,7 +376,10 @@ func parseMethodAnnotation(f *reflect.StructField, td *TypeDefinition) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if nil != as && 0 < len(as) { | 	if nil != as && 0 < len(as) { | ||||||
| 		td.MethodAnnotations = as | 		if nil == td.MethodAnnotations { | ||||||
|  | 			td.MethodAnnotations = make(map[string]map[string]cda.Annotation, 0) | ||||||
|  | 		} | ||||||
|  | 		td.MethodAnnotations[f.Name] = as | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user