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  }