github.com/mailru/activerecord@v1.12.2/internal/pkg/parser/flag.go (about) 1 package parser 2 3 import ( 4 "go/ast" 5 "strings" 6 7 "github.com/mailru/activerecord/internal/pkg/arerror" 8 "github.com/mailru/activerecord/internal/pkg/ds" 9 ) 10 11 // Парсинг флагов. В описании модели можно указать, что целочисленное значение используется для хранения 12 // битовых флагов. В этом случае на поле навешиваются мутаторы SetFlag и ClearFlag 13 func ParseFlags(dst *ds.RecordPackage, fields []*ast.Field) error { 14 for _, field := range fields { 15 if field.Names == nil || len(field.Names) != 1 { 16 return &arerror.ErrParseFlagDecl{Err: arerror.ErrNameDeclaration} 17 } 18 19 newflag := ds.FlagDeclaration{ 20 Name: field.Names[0].Name, 21 Flags: []string{}, 22 } 23 24 tagParam, err := splitTag(field, CheckFlagEmpty, map[TagNameType]ParamValueRule{}) 25 if err != nil { 26 return &arerror.ErrParseFlagDecl{Name: newflag.Name, Err: err} 27 } 28 29 for _, kv := range tagParam { 30 switch kv[0] { 31 case "flags": 32 newflag.Flags = strings.Split(kv[1], ",") 33 default: 34 return &arerror.ErrParseFlagTagDecl{Name: newflag.Name, TagName: kv[0], TagValue: kv[1], Err: arerror.ErrParseTagUnknown} 35 } 36 } 37 38 fldNum, ok := dst.FieldsMap[newflag.Name] 39 if !ok { 40 return &arerror.ErrParseFlagDecl{Name: newflag.Name, Err: arerror.ErrFieldNotExist} 41 } 42 43 foundSet, foundClear := false, false 44 45 for _, mut := range dst.Fields[fldNum].Mutators { 46 if mut == ds.SetBitMutator { 47 foundSet = true 48 } 49 50 if mut == ds.SetBitMutator { 51 foundClear = true 52 } 53 } 54 55 if !foundSet { 56 dst.Fields[fldNum].Mutators = append(dst.Fields[fldNum].Mutators, ds.SetBitMutator) 57 } 58 59 if !foundClear { 60 dst.Fields[fldNum].Mutators = append(dst.Fields[fldNum].Mutators, ds.ClearBitMutator) 61 } 62 63 if err = dst.AddFlag(newflag); err != nil { 64 return err 65 } 66 } 67 68 return nil 69 }