Files
brolang/examples/programs/errors/main.bro
T
2026-06-30 20:40:40 +02:00

128 lines
2.0 KiB
Plaintext

BasicError :: enum {
bad
worse
}
DetailError :: union(enum) {
code i32
empty void
}
BasicOrDetail :: alias BasicError | DetailError
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
if (value < 0) return .worse
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
}
via_widen func(value i32) i32 ! BasicOrDetail {
unwrapped :: try maybe(value)
return unwrapped + 2
}
catch_basic func(value i32) i32 {
return maybe(value) catch |e| {
if (e == .bad) {
yield 21
} else {
yield 22
}
}
}
catch_detail func(value i32) i32 {
return with_detail(value) catch |e| {
match e {
.code |n|: yield n + 30
.empty: yield 40
}
}
}
catch_widen func(value i32) i32 {
return via_widen(value) catch |e| {
match e {
.bad: yield 50
.worse: yield 51
.code |n|: yield n
.empty: yield 52
}
}
}
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
g :: catch_basic(0)
h :: catch_basic(-1)
i :: catch_detail(0)
j :: catch_detail(1)
k :: via_widen(3) catch 99
l :: catch_widen(0)
m :: catch_widen(-1)
acc = acc + a + b + c + d + e + f + g + h + i + j + k + l + m
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 + 21 + 22 + 35 + 40 + 6 + 50 + 51 + 10 + 20 + 8 + 3 = 309
return acc - 309
}