macro for sum type sugar
Generates kind enum and objects for each case branch allowing multiple fields with the same name across branches. These objects can also be made ref objects with kind: ref _. Each branch can also individually be made a ref object via of ref KindName.
Also generates constructors for branches with only one field _: sometype.
Example:
import skinsuit/sum type Foo {.sum.} = object case kind: _ of A: x, y: int let a = Foo(kind: A) assert a.kind is FooKind var b = Foo(kind: A) b.x = 1 assert b.x == 1 let c = Foo(kind: A, a: FooA(x: 1, y: 2)) b.y = 2 assert b.a == c.a type Value {.sum.} = object case kind: _ of None: discard of Integer, Boolean: _: int of Unsigned: _: uint of Float: _: float assert $Value(kind: None) == "(kind: None, none: ())" assert $Value(kind: Integer, integer: 1) == $Integer(1) assert $Value(kind: Boolean, integer: 1) == $Boolean(1) assert $Value(kind: Unsigned, unsigned: 1) == $Unsigned(1) assert $Value(kind: Float, float: 1) == $Float(1)