diff --git a/rest/client/client.go b/rest/client/client.go index 5e5c85ad..094f983a 100644 --- a/rest/client/client.go +++ b/rest/client/client.go @@ -76,6 +76,10 @@ func (c *Client) CallURL(ctx context.Context, method, uri string, response any, req.SetHeaderMultiValues(options.Headers) req.SetResult(response).SetError(&models.ErrorResponse{}) + if options.Limiter != nil { + options.Limiter.Take() + } + res, err := req.Execute(method, uri) if err != nil { return fmt.Errorf("failed to execute request: %w", err) diff --git a/rest/models/request.go b/rest/models/request.go index b26bb596..e67ec9d1 100644 --- a/rest/models/request.go +++ b/rest/models/request.go @@ -3,6 +3,7 @@ package models import ( "net/http" "net/url" + "time" ) // RequestOptions are used to configure client calls. @@ -18,6 +19,9 @@ type RequestOptions struct { // Trace enables request tracing Trace bool + + // Limiter used to rate limit requests + Limiter RateLimiter } // RequestOption changes the configuration of RequestOptions. @@ -85,3 +89,14 @@ func WithTrace(trace bool) RequestOption { o.Trace = trace } } + +type RateLimiter interface { + Take() time.Time +} + +// WithRateLimiter sets Ratelimiter to limit request rate. +func WithRateLimiter(limiter RateLimiter) RequestOption { + return func(o *RequestOptions) { + o.Limiter = limiter + } +}