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 }