Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-mediator

In-process messaging for Pudu: requests, notifications, streams, pipeline behaviors, processors, and exception handling

0.1.0Apache-2.01

InstallClose

ExceptionHandling.pudu

Pudu48 lines2.2 KB

GitHub ↗
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 | Timeout1415/// Recovers missing profiles with a default and reports every failure that remains.16fn 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