
RateLimiting.pudu
Pudu41 lines1.5 KB
1/** @Examples.RateLimiting.Program — a token bucket guarding a pipeline */2module RateLimiting34import Std.Io as Io5import PuduLangResilience.Clock as Clock6import PuduLangResilience.Context as Context7import PuduLangResilience.Limiter.TokenBucket as TokenBucket8import PuduLangResilience.Pipeline as Pipeline9import PuduLangResilience.RateLimiter as RateLimiter10import PuduLangResilience as Resilience111213fn main() -> Int {14 let clock = Clock.manual(0)15 let bucket = match TokenBucket.create(&TokenBucket.Options{..TokenBucket.defaults(), tokenLimit: 3, tokensPerPeriod: 3, replenishmentPeriod: 1000, clock: Clock.ofManual(&clock)}) {16 case Ok(found) => found17 case Err(problems) => {18 let _said = Io.writeErrorLine(problems.join("; "))19 return 120 }21 }22 let pipeline = match Pipeline.build([RateLimiter.strategy(RateLimiter.using(bucket))]) {23 case Ok(found) => found24 case Err(invalid) => {25 let _said = Io.writeErrorLine(Pipeline.explain(&invalid))26 return 127 }28 }29 let request = fn(_context: Context.Context) -> Resilience.Outcome[Int, Str] { Ok(1) }30 var admitted = 031 for _call in [1, 2, 3, 4] {32 let outcome = Pipeline.execute(&pipeline, request)33 let _shown = Io.writeLine(Resilience.summarize(&outcome))34 if outcome == Ok(1) { admitted = admitted + 1 }35 }36 Clock.advance(&clock, 1000)37 let refilled = Pipeline.execute(&pipeline, request)38 let _after = Io.writeLine("after a refill: " + Resilience.summarize(&refilled))39 if admitted == 3 && refilled == Ok(1) { 0 } else { 1 }40}41