github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istructsmem/internal/descr/impl.go (about) 1 /* 2 * Copyright (c) 2021-present Sigma-Soft, Ltd. 3 * @author: Nikolay Nikitin 4 */ 5 6 package descr 7 8 import ( 9 "github.com/voedger/voedger/pkg/appdef" 10 "github.com/voedger/voedger/pkg/istructs" 11 ) 12 13 func newApplication() *Application { 14 a := Application{ 15 Packages: make(map[string]*Package), 16 } 17 return &a 18 } 19 20 func (a *Application) read(app istructs.IAppStructs, rateLimits map[appdef.QName]map[istructs.RateLimitKind]istructs.RateLimit) { 21 a.Packages = make(map[string]*Package) 22 23 app.AppDef().Packages(func(localName, fullPath string) { 24 if localName == appdef.SysPackage { 25 return 26 } 27 pkg := newPackage() 28 pkg.Name = localName 29 pkg.Path = fullPath 30 a.Packages[localName] = pkg 31 }) 32 33 a.Name = app.AppQName() 34 35 app.AppDef().Types(func(typ appdef.IType) { 36 name := typ.QName() 37 38 if name.Pkg() == appdef.SysPackage { 39 return 40 } 41 42 pkg := getPkg(name, a) 43 44 if data, ok := typ.(appdef.IData); ok { 45 if !data.IsSystem() { 46 d := newData() 47 d.read(data) 48 pkg.DataTypes[name.String()] = d 49 } 50 return 51 } 52 53 if str, ok := typ.(appdef.IStructure); ok { 54 s := newStructure() 55 s.read(str) 56 pkg.Structures[name.String()] = s 57 return 58 } 59 60 if view, ok := typ.(appdef.IView); ok { 61 v := newView() 62 v.read(view) 63 pkg.Views[name.String()] = v 64 return 65 } 66 67 if ext, ok := typ.(appdef.IExtension); ok { 68 if pkg.Extensions == nil { 69 pkg.Extensions = newExtensions() 70 } 71 pkg.Extensions.read(ext) 72 return 73 } 74 75 if role, ok := typ.(appdef.IRole); ok { 76 r := newRole() 77 r.read(role) 78 pkg.Roles[name.String()] = r 79 return 80 } 81 }) 82 83 for qName, qNameRateLimit := range rateLimits { 84 pkg := getPkg(qName, a) 85 for rlKind, rl := range qNameRateLimit { 86 rateLimit := newRateLimit() 87 rateLimit.Kind = rlKind 88 rateLimit.MaxAllowedPerDuration = rl.MaxAllowedPerDuration 89 rateLimit.Period = rl.Period 90 pkg.RateLimits[qName.String()] = append(pkg.RateLimits[qName.String()], rateLimit) 91 } 92 } 93 } 94 95 func getPkg(name appdef.QName, a *Application) *Package { 96 pkgName := name.Pkg() 97 pkg := a.Packages[pkgName] 98 if pkg == nil { 99 pkg = newPackage() 100 pkg.Name = pkgName 101 a.Packages[pkgName] = pkg 102 } 103 return pkg 104 } 105 106 func newPackage() *Package { 107 return &Package{ 108 DataTypes: make(map[string]*Data), 109 Structures: make(map[string]*Structure), 110 Views: make(map[string]*View), 111 Roles: make(map[string]*Role), 112 Resources: make(map[string]*Resource), 113 RateLimits: make(map[string][]*RateLimit), 114 } 115 }