
ExceptionHandling.pudu
Pudu48 lines2.2 KB
1/** @Examples.ExceptionHandling.Program — exception handlers that recover and actions that observe */2module ExceptionHandling34import Std.Io as Io5import PuduLangMediator.Catalog as Catalog6import PuduLangMediator.Context as Context7import PuduLangMediator.Mediator as Mediator8import PuduLangMediator as Messaging9import PuduLangMediator.Registration as Registration10import PuduLangMediator.Request as Request1112/** @Examples.ExceptionHandling.Fault — what the lookup can fail with */13type Fault = NotFound | Timeout141516fn main() -> Int {17 let profile: Request.Kind[Int, Str, Fault] = Request.kind("profiles.get")18 let registrations = [19 Registration.handler(&profile, fn(id: Int, _context: Context.Context) -> Messaging.Outcome[Str, Fault] {20 match id {21 case 1 => Ok("ada")22 case 2 => Messaging.raise(NotFound)23 case _ => Messaging.raise(Timeout)24 }25 }),26 Registration.exceptionHandler(&profile, fn(_id: Int, failure: Messaging.Failure[Fault], _context: Context.Context) -> Option[Str] {27 if Messaging.raised(&failure) == Some(NotFound) { Some("guest") } else { None }28 }),29 Registration.exceptionAction(&profile, fn(id: Int, failure: Messaging.Failure[Fault], _context: Context.Context) -> () {30 let _said = Io.writeLine("profile " + show(id) + ": " + Messaging.describe(&failure))31 })32 ]33 let unhandledOnly = match Mediator.build(registrations) {34 case Ok(found) => found35 case Err(invalid) => panic(Mediator.explain(&invalid))36 }37 let everyFailure = match Mediator.buildWith(&Mediator.Options{..Mediator.defaults(), actionScope: Catalog.ForAll}, registrations) {38 case Ok(found) => found39 case Err(invalid) => panic(Mediator.explain(&invalid))40 }41 let found = Mediator.send(&unhandledOnly, &profile, 1)42 let recovered = Mediator.send(&unhandledOnly, &profile, 2)43 let failed = Mediator.send(&unhandledOnly, &profile, 3)44 let _said = Io.writeLine("with every failure in scope:")45 let recoveredAndSeen = Mediator.send(&everyFailure, &profile, 2)46 if found == Ok("ada") && recovered == Ok("guest") && failed == Err(Messaging.Raised(Timeout)) && recoveredAndSeen == Ok("guest") { 0 } else { 1 }47}48