main :: () {
    my_print("Hello, %\n", "world");
    my_print("Missing: %\n");
    Foo :: struct {}
    my_print("Struct: %\n", Foo.{});
    my_print("Numbers: %, %, %\n", 42, 3.14, -100);
    my_print("Boolean: %, %\n", true, false);
    my_print("Mixed: % + % = %\n", 10, 20, 30);
    my_print("Escaped %%: %\n", "works");
    my_print("No args test\n");
}

my_print :: (fmt: string, args: ..Any) {
    sb: String_Builder;

    // TODO: Spread operator!!!!
    // sb_print(*sb, ..args);

    i := 0;
    arg_index := 0;

    while i < fmt.len {
        c := fmt[i];

        if c != '%' {
            // Regular char
            sb_append(*sb, c);
            i += 1;
            continue;
        }

        if i + 1 < fmt.len && fmt[i + 1] == '%' {
            // Escaped %%
            sb_append(*sb, '%');
            i += 2;
            continue;
        }

        if arg_index < args.len {
            arg := args[arg_index];
            sb_append_any(*sb, arg);
            arg_index += 1;
        } else {
            sb_append(*sb, "<missing>");
        }

        i += 1;
    }

    sb_append_nul(*sb);
    s := sb_to_string(*sb);
    print("%", s); // @Hack
}

#run main();

#import "std.rok";
#import "sb.rok";
