object variants generalized to any condition for each possible union value
currently uses {.union.} (in the future it may change), so can be buggy with memory managed types
Example:
import skinsuit/conditional type Foo {.conditional.} = ref object num: int case branch: _ # type has to be _, all types without a case branch with _ as discriminator type are kept in the type section # the name "branch" can be changed or made _ in which case it defaults to "branch" for now of Odd, num mod 2 == 1: # branch names can also be _ name: string of DoubleEven, num mod 4 == 0: a, b: int of Even: a: int # duplicate names are allowed, only the accessors care that they have the same type var foo = Foo(num: 1) foo.name = "abc" doAssert foo.name == "abc" doAssert foo.branch == Odd # branch is not an actual variable foo.num = 2 foo.resetBranch() # advantage over object variants, named after "branch" foo.a = 3 doAssert foo.a == 3 doAssert foo.branch == Even foo.num = 16 doAssert foo.a == 3 foo.b = 4 doAssert foo.b == 4 doAssert foo.branch == DoubleEven foo.resetBranch() doAssert foo.a == 0 doAssert foo.b == 0
Types
ConditionalFieldDefect = object of FieldDefect
- Source Edit
Macros
macro conditional(body)
- Source Edit