Files
brolang/examples/programs/errors/main.bro
T
2026-06-30 19:38:28 +02:00

83 lines
1.2 KiB
Plaintext

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
}