github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/appdef/impl_ratelimit.go (about)

     1  /*
     2   * Copyright (c) 2024-present Sigma-Soft, Ltd.
     3   * @author: Nikolay Nikitin
     4   */
     5  
     6  package appdef
     7  
     8  import "github.com/voedger/voedger/pkg/goutils/set"
     9  
    10  // Implements:
    11  //   - IRate
    12  type rate struct {
    13  	typ
    14  	count  RateCount
    15  	period RatePeriod
    16  	scopes set.Set[RateScope]
    17  }
    18  
    19  func newRate(app *appDef, name QName, count RateCount, period RatePeriod, scopes []RateScope, comment ...string) *rate {
    20  	r := &rate{
    21  		typ:    makeType(app, name, TypeKind_Rate),
    22  		count:  count,
    23  		period: period,
    24  		scopes: set.From(scopes...),
    25  	}
    26  	if r.scopes.Len() == 0 {
    27  		r.scopes.Set(DefaultRateScopes...)
    28  	}
    29  	r.typ.comment.setComment(comment...)
    30  	app.appendType(r)
    31  	return r
    32  }
    33  
    34  func (r rate) Count() RateCount {
    35  	return r.count
    36  }
    37  
    38  func (r rate) Period() RatePeriod {
    39  	return r.period
    40  }
    41  
    42  func (r rate) Scopes() []RateScope {
    43  	return r.scopes.AsArray()
    44  }
    45  
    46  // Implements:
    47  //   - ILimit
    48  type limit struct {
    49  	typ
    50  	on   QNames
    51  	rate IRate
    52  }
    53  
    54  func newLimit(app *appDef, name QName, on []QName, rate QName, comment ...string) *limit {
    55  	l := &limit{
    56  		typ:  makeType(app, name, TypeKind_Limit),
    57  		on:   on,
    58  		rate: app.Rate(rate),
    59  	}
    60  	if len(l.on) == 0 {
    61  		panic(ErrMissed("limit objects names"))
    62  	}
    63  	if l.rate == nil {
    64  		panic(ErrNotFound("rate «%v»", rate))
    65  	}
    66  	l.typ.comment.setComment(comment...)
    67  	app.appendType(l)
    68  	return l
    69  }
    70  
    71  func (l limit) On() QNames {
    72  	return l.on
    73  }
    74  
    75  func (l limit) Rate() IRate {
    76  	return l.rate
    77  }
    78  
    79  func (l limit) Validate() (err error) {
    80  	return validateLimitNames(l.app, l.on)
    81  }