github.com/mailru/activerecord@v1.12.2/internal/pkg/ds/package.go (about)

     1  package ds
     2  
     3  import (
     4  	"errors"
     5  	"regexp"
     6  
     7  	"github.com/mailru/activerecord/internal/pkg/arerror"
     8  )
     9  
    10  // PkgNameRx регулярное выражение вырезающее имя импортируемого пакета
    11  var PkgNameRx = regexp.MustCompile(`([^/"]+)"?$`)
    12  
    13  // Функция для получения имени импортируемого пакета из пути
    14  func getImportName(path string) (string, error) {
    15  	matched := PkgNameRx.FindStringSubmatch(path)
    16  	if len(matched) < 2 {
    17  		return "", &arerror.ErrParseImportDecl{Name: path, Err: arerror.ErrNameDeclaration}
    18  	}
    19  
    20  	return matched[1], nil
    21  }
    22  
    23  // Добавление нового поля в результирующий пакет
    24  func (rc *RecordPackage) AddField(f FieldDeclaration) error {
    25  	// Проверка на то, что имя не дублируется
    26  	if _, ex := rc.FieldsMap[f.Name]; ex {
    27  		return &arerror.ErrParseTypeFieldDecl{Name: f.Name, FieldType: string(f.Format), Err: arerror.ErrRedefined}
    28  	}
    29  
    30  	// добавляем поле и не забываем про обратны индекс
    31  	rc.FieldsMap[f.Name] = len(rc.Fields)
    32  	rc.Fields = append(rc.Fields, f)
    33  
    34  	return nil
    35  }
    36  
    37  // Добавление нового параметра процедуры в результирующий пакет
    38  func (rc *RecordPackage) AddProcField(f ProcFieldDeclaration) error {
    39  	// Проверка на то, что имя не дублируется
    40  	if _, ex := rc.ProcFieldsMap[f.Name]; ex {
    41  		return &arerror.ErrParseTypeFieldDecl{Name: f.Name, FieldType: string(f.Format), Err: arerror.ErrRedefined}
    42  	}
    43  
    44  	// добавляем поле и не забываем про обратный индекс
    45  	rc.ProcFieldsMap[f.Name] = len(rc.ProcFieldsMap)
    46  	// добавляем поле во входные параметры
    47  	if f.Type == IN || f.Type == INOUT {
    48  		rc.ProcInFields = append(rc.ProcInFields, f)
    49  	}
    50  	// добавляем поле в выходные параметры
    51  	if f.Type == OUT || f.Type == INOUT {
    52  		if err := rc.ProcOutFields.Add(f); err != nil {
    53  			return &arerror.ErrParseTypeFieldDecl{Name: f.Name, FieldType: f.Type.String(), Err: err}
    54  		}
    55  	}
    56  
    57  	return nil
    58  }
    59  
    60  // Добавление нового ссылочного поля
    61  func (rc *RecordPackage) AddFieldObject(fo FieldObject) error {
    62  	if _, ex := rc.FieldsObjectMap[fo.Name]; ex {
    63  		return &arerror.ErrParseTypeFieldDecl{Name: fo.Name, Err: arerror.ErrRedefined}
    64  	}
    65  
    66  	rc.FieldsObjectMap[fo.Name] = fo
    67  
    68  	return nil
    69  }
    70  
    71  // Добавление индекса
    72  func (rc *RecordPackage) AddIndex(ind IndexDeclaration) error {
    73  	if _, ex := rc.IndexMap[ind.Name]; ex {
    74  		return &arerror.ErrParseTypeIndexDecl{IndexType: "index", Name: ind.Name, Err: arerror.ErrRedefined}
    75  	}
    76  
    77  	if (ind.Primary || ind.Unique) && ind.Selector == "" {
    78  		ind.Selector = "SelectBy" + ind.Name
    79  	}
    80  
    81  	if _, ex := rc.SelectorMap[ind.Selector]; ex {
    82  		return &arerror.ErrParseTypeIndexDecl{IndexType: "index", Name: ind.Name, Err: arerror.ErrRedefined}
    83  	}
    84  
    85  	if ind.Primary {
    86  		ind.Unique = true
    87  		for fInd := range ind.Fields {
    88  			rc.Fields[ind.Fields[fInd]].PrimaryKey = true
    89  		}
    90  	}
    91  
    92  	if !ind.Partial && ind.Num == 0 && len(rc.Indexes) > 0 {
    93  		ind.Num = rc.Indexes[len(rc.Indexes)-1].Num + 1
    94  	}
    95  
    96  	rc.IndexMap[ind.Name] = len(rc.Indexes)
    97  	rc.SelectorMap[ind.Selector] = len(rc.Indexes)
    98  	rc.Indexes = append(rc.Indexes, ind)
    99  
   100  	return nil
   101  }
   102  
   103  func (rc *ImportPackage) AddImport(path string, reqImportName ...string) (ImportDeclaration, error) {
   104  	if len(reqImportName) > 1 {
   105  		return ImportDeclaration{}, &arerror.ErrParseImportDecl{Path: path, Err: arerror.ErrInvalidParams}
   106  	}
   107  
   108  	resultImportName := ""
   109  
   110  	searchImportName, err := getImportName(path)
   111  	if err != nil {
   112  		return ImportDeclaration{}, &arerror.ErrParseImportDecl{Path: path, Name: "UNKNOWN", Err: arerror.ErrGetImportName}
   113  	}
   114  
   115  	if len(reqImportName) == 1 && reqImportName[0] != "" {
   116  		if reqImportName[0] != searchImportName {
   117  			resultImportName = reqImportName[0]
   118  		}
   119  
   120  		searchImportName = reqImportName[0]
   121  	}
   122  
   123  	if imp, ex := rc.ImportMap[path]; ex {
   124  		if rc.Imports[imp].ImportName == resultImportName {
   125  			return rc.Imports[imp], nil
   126  		}
   127  	}
   128  
   129  	if imp, ex := rc.ImportPkgMap[searchImportName]; ex {
   130  		if rc.Imports[imp].Path != path {
   131  			return ImportDeclaration{}, &arerror.ErrParseImportDecl{Path: path, Name: searchImportName, Err: arerror.ErrDuplicate}
   132  		}
   133  
   134  		return rc.Imports[imp], nil
   135  	}
   136  
   137  	newImport := ImportDeclaration{
   138  		Path:       path,
   139  		ImportName: resultImportName,
   140  	}
   141  
   142  	rc.ImportMap[newImport.Path] = len(rc.Imports)
   143  	rc.ImportPkgMap[searchImportName] = len(rc.Imports)
   144  	rc.Imports = append(rc.Imports, newImport)
   145  
   146  	return newImport, nil
   147  }
   148  
   149  func (rc *ImportPackage) FindImport(path string) (ImportDeclaration, error) {
   150  	if impNum, ex := rc.ImportMap[path]; ex {
   151  		return rc.Imports[impNum], nil
   152  	}
   153  
   154  	return ImportDeclaration{}, &arerror.ErrParseImportDecl{Path: path, Err: arerror.ErrParseImportNotFound}
   155  }
   156  
   157  func (rc *ImportPackage) FindImportByPkg(pkg string) (*ImportDeclaration, error) {
   158  	if impNum, ex := rc.ImportPkgMap[pkg]; ex {
   159  		return &rc.Imports[impNum], nil
   160  	}
   161  
   162  	return nil, &arerror.ErrParseImportDecl{Name: pkg, Err: arerror.ErrParseImportNotFound}
   163  }
   164  
   165  func (rc *ImportPackage) FindOrAddImport(path, importName string) (ImportDeclaration, error) {
   166  	imp, err := rc.FindImport(path)
   167  	if err != nil {
   168  		var impErr *arerror.ErrParseImportDecl
   169  
   170  		if errors.As(err, &impErr) && errors.Is(impErr.Err, arerror.ErrParseImportNotFound) {
   171  			imp, err = rc.AddImport(path, importName)
   172  			if err != nil {
   173  				return ImportDeclaration{}, err
   174  			}
   175  
   176  			return imp, nil
   177  		}
   178  
   179  		return ImportDeclaration{}, err
   180  	}
   181  
   182  	return imp, nil
   183  }
   184  
   185  func (rc *RecordPackage) AddTrigger(t TriggerDeclaration) error {
   186  	if _, ex := rc.TriggerMap[t.Name]; ex {
   187  		return &arerror.ErrParseTriggerDecl{Name: t.Name, Err: arerror.ErrRedefined}
   188  	}
   189  
   190  	rc.TriggerMap[t.Name] = t
   191  
   192  	return nil
   193  }
   194  
   195  func (rc *RecordPackage) AddSerializer(s SerializerDeclaration) error {
   196  	if _, ex := rc.SerializerMap[s.Name]; ex {
   197  		return &arerror.ErrParseSerializerDecl{Name: s.Name, Err: arerror.ErrRedefined}
   198  	}
   199  
   200  	rc.SerializerMap[s.Name] = s
   201  
   202  	return nil
   203  }
   204  
   205  func (rc *RecordPackage) AddFlag(f FlagDeclaration) error {
   206  	if _, ok := rc.FlagMap[f.Name]; ok {
   207  		return &arerror.ErrParseFlagDecl{Name: f.Name, Err: arerror.ErrDuplicate}
   208  	}
   209  
   210  	rc.FlagMap[f.Name] = f
   211  
   212  	return nil
   213  }
   214  
   215  func (rc *RecordPackage) AddMutator(m MutatorDeclaration) error {
   216  	if _, ex := rc.MutatorMap[m.Name]; ex {
   217  		return &arerror.ErrParseMutatorDecl{Name: m.Name, Err: arerror.ErrRedefined}
   218  	}
   219  
   220  	rc.MutatorMap[m.Name] = m
   221  
   222  	return nil
   223  }
   224  
   225  func (rc *RecordPackage) AddPartialField(m MutatorDeclaration) error {
   226  	if _, ex := rc.MutatorMap[m.Name]; ex {
   227  		return &arerror.ErrParseMutatorDecl{Name: m.Name, Err: arerror.ErrRedefined}
   228  	}
   229  
   230  	rc.MutatorMap[m.Name] = m
   231  
   232  	return nil
   233  }