// Comptime reflection — `type_info($T)`: reflect a SOURCE enum INTO a `TypeInfo`
// value, then feed that value straight back to `define` to mint a byte-identical
// copy. This is the inverse of `define`'s decode: `type_info` reads a type's
// variants (name + payload type) out of the type table and constructs the same
// `.enum(EnumInfo{ variants })` value the `define` examples write by hand.
//
// Round-trip: `ShapeCopy` is reconstructed purely from `type_info(Shape)` — no
// literal variant list — and constructs/matches like the original.
#import "modules/std.sx";
#import "modules/std/meta.sx";

Shape :: enum {
    circle: f64;
    rect: i64;
    empty;
}

// Reflect Shape → TypeInfo, then reconstruct an identical nominal enum.
ShapeCopy :: define(declare("ShapeCopy"), type_info(Shape));

describe :: (s: ShapeCopy) {
    if s == {
        case .circle: (r) { print("circle r={}\n", r); }
        case .rect:   (n) { print("rect n={}\n", n); }
        case .empty:       { print("empty\n"); }
    }
}

main :: () -> i32 {
    describe(.circle(2.5));
    describe(.rect(7));
    describe(.empty);
    return 0;
}
