// Comptime STRUCT metaprogramming — `define` constructs a struct (not just an
// enum), and `type_info` reflects one. Two paths:
//   1. Programmatic build: `define(declare("Vec2"), .struct(.{ fields = … }))`
//      mints a nominal struct from a `[]StructField` value.
//   2. Round-trip: `define(declare("RowCopy"), type_info(Row))` reflects a source
//      struct INTO a `.struct(StructInfo)` value and reconstructs an identical
//      one — no literal field list.
// Both constructed structs build + read like any hand-written struct.
#import "modules/std.sx";
#import "modules/std/meta.sx";

Vec2 :: define(declare("Vec2"), .struct(.{ fields = .[
    StructField.{ name = "x", type = f64 },
    StructField.{ name = "y", type = f64 },
] }));

Row :: struct { id: i64; score: f64; }
RowCopy :: define(declare("RowCopy"), type_info(Row));

main :: () -> i32 {
    v := Vec2.{ x = 1.5, y = -2.0 };
    print("v = {} {}\n", v.x, v.y);

    r := RowCopy.{ id = 42, score = 9.5 };
    print("r = {} {}\n", r.id, r.score);
    return 0;
}
