package annotation import ( "fmt" "reflect" "strings" "git.loafle.net/commons_go/di" ) const ( AnnotationStartChar = "(" AnnotationEndChar = ")" AnnotationAttributeSpliter = "," AnnotationKeyValueSpliter = "=" ) type Annotation interface { } // @Inject(name? string) // @Resource(name? string) func ParseAnnotation(tag reflect.StructTag) (map[string]Annotation, error) { a := strings.Trim(tag.Get(di.AnnotationTag), " ") if "" == a { return nil, nil } rKVs := make(map[string]Annotation) inject, err := ParseInject(a) if nil != err { return nil, err } rKVs[InjectTag] = inject resource, err := ParseResource(a) if nil != err { return nil, err } rKVs[ResourceTag] = resource return rKVs, nil } func ParseAttribute(a string, startIndex int) (map[string]string, error) { if startIndex >= len(a) { return nil, nil } if AnnotationStartChar != string([]rune(a)[startIndex]) { return nil, nil } endIndex := strings.Index(a[startIndex+1:], AnnotationEndChar) if -1 == endIndex { return nil, fmt.Errorf("DI: Syntax error - annotation(%s) has '%s', but '%s' is not exist", a, AnnotationStartChar, AnnotationEndChar) } endIndex = endIndex + startIndex + 1 body := a[startIndex+1 : endIndex] kvs := strings.Split(body, AnnotationAttributeSpliter) if 0 == len(kvs) { return nil, nil } rKVs := make(map[string]string) for i := 0; i < len(kvs); i++ { s := strings.Trim(kvs[i], " ") if "" == s { continue } kv := strings.Split(s, AnnotationKeyValueSpliter) k := strings.Trim(kv[0], " ") v := strings.Trim(kv[1], " ") rKVs[k] = v } return rKVs, nil }