
Integrations.pudu
Pudu51 lines2.5 KB
1/** @Examples.Integrations.Program — validation, structured logging, and resilience as behaviors */2module Integrations34import Std.Io as Io5import PuduLangLog.Configuration as Configuration6import PuduLangLog as Log7import PuduLangLog.Sinks.Console as Console8import PuduLangMediator.Behaviors.Logging as Logging9import PuduLangMediator.Behaviors.Resilient as Resilient10import PuduLangMediator.Behaviors.Validation as Validation11import PuduLangMediator.Context as Context12import PuduLangMediator.Mediator as Mediator13import PuduLangMediator as Messaging14import PuduLangMediator.Registration as Registration15import PuduLangMediator.Request as Request16import PuduLangMediator.Utils.Shared as Shared17import PuduLangResilience.Pipeline as Pipeline18import PuduLangResilience.Retry as Retry19import PuduLangValidator.Rule as Rule20import PuduLangValidator.Rules.Text as TextRule21import PuduLangValidator.Validator as Validator222324fn main() -> Int {25 let lookup: Request.Kind[Str, Str, Str] = Request.kind("accounts.lookup")26 let logger = Configuration.create().minimumLevel(Log.Information).writeTo(Console.sink(Console.defaults())).createLogger()27 let rules = Validator.add(Validator.create(), Rule.build(TextRule.notEmpty(Rule.ruleFor("email", |email: Str| email))))28 let retrying = match Pipeline.build([Retry.strategy(Retry.Options{..Retry.defaults(), maxRetryAttempts: 2, delay: 10})]) {29 case Ok(found) => found30 case Err(invalid) => panic(Pipeline.explain(&invalid))31 }32 let calls = Shared.shared(0)33 let built = Mediator.build([34 Registration.openBehavior(Logging.of(logger)),35 Validation.register(&lookup, rules),36 Resilient.register(&lookup, retrying),37 Registration.handler(&lookup, fn(email: Str, _context: Context.Context) -> Messaging.Outcome[Str, Str] {38 let made = Shared.change(&calls, fn(count: Int) -> (Int, Int) { (count + 1, count + 1) })39 if made < 2 { Messaging.raise("connection reset") } else { Ok("account of " + email) }40 })41 ])42 let mediator = match built {43 case Ok(found) => found44 case Err(invalid) => panic(Mediator.explain(&invalid))45 }46 let found = Mediator.send(&mediator, &lookup, "ada@example.com")47 let refused = Mediator.send(&mediator, &lookup, "")48 let _said = Io.writeLine(Messaging.summarize(&refused))49 if found == Ok("account of ada@example.com") && Shared.current(&calls) == 2 && Messaging.violations(&(match refused { case Err(failure) => failure case Ok(_) => Messaging.Refused("") })).length() == 1 { 0 } else { 1 }50}51