BasicError :: enum { bad worse } DetailError :: union(enum) { code i32 empty void } Left :: enum { left } Right :: enum { right } Both :: alias Left | Right BoxA :: union(enum) { a i32 } BoxB :: union(enum) { b void } Box :: alias BoxA | BoxB maybe :: func(value i32) i32 ! BasicError { if (value == 0) return .bad return value + 1 } via_try :: func(value i32) i32 ! BasicError { unwrapped :: try maybe(value) return unwrapped + 1 } with_detail :: func(value i32) i32 ! DetailError { if (value == 0) return DetailError{ code = 5 } if (value == 1) return .empty return value } pick :: func(value Both) i32 { match value { .left: return 10 .right: return 20 } } payload :: func(value Box) i32 { match value { .a |n|: return n .b: return 3 } } main :: func() i32 { acc i32 = 0 a :: maybe(0) catch 7 b :: maybe(4) catch 99 c :: via_try(3) catch 99 d :: via_try(0) catch 11 e :: with_detail(0) catch 13 f :: with_detail(2) catch 99 acc = acc + a + b + c + d + e + f acc = acc + pick(.left) r Right = .right acc = acc + pick(r) box BoxA = BoxA{ a = 8 } acc = acc + payload(box) empty BoxB = .b acc = acc + payload(empty) # 7 + 5 + 5 + 11 + 13 + 2 + 10 + 20 + 8 + 3 = 84 return acc - 84 }