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  }