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 }