error handling kickoff
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user