simple server flow

✓ Passing This code compiles and runs correctly.

Code

// ============================================================================
// VERIFIED REGRESSION TEST - DO NOT MODIFY WITHOUT DISCUSSION
// ============================================================================
// Test 208: Simple server-style flow with nested labels
// A simplified synthetic example inspired by tcp-echo for flow visualization
// ============================================================================

const std = @import("std");

// Server events
~event listen { port: u16 }
| ready u32
| failed []const u8

~proc listen {
    std.debug.print("Listening on port {}\n", .{port});
    if (port == 0) {
        return .{ .failed = "Invalid port" };
    }
    return .{ .ready = port };
}

~event accept { server: u32 }
| connected { conn: u32, server: u32 }
| failed u32

~proc accept {
    std.debug.print("Accepting connection\n", .{});
    if (server == 9999) {
        return .{ .failed = server };
    }
    return .{ .connected = .{ .conn = server + 1, .server = server } };
}

~event process { conn: u32 }
| done u32
| retry u32
| error { conn: u32, msg: []const u8 }

~proc process {
    std.debug.print("Processing connection {}\n", .{conn});
    if (conn % 3 == 0) {
        return .{ .error = .{ .conn = conn, .msg = "Processing error" } };
    }
    if (conn % 2 == 0) {
        return .{ .done = conn };
    }
    return .{ .retry = conn };
}

~event close { conn: u32 }
| closed

~proc close {
    std.debug.print("Closed connection {}\n", .{conn});
    return .{ .closed = .{} };
}

~event log_error { conn: u32, msg: []const u8 }
| logged u32

~proc log_error {
    std.debug.print("Error on connection {}: {s}\n", .{conn, msg});
    return .{ .logged = conn };
}

~event cleanup { conn: u32 }
| cleaned

~proc cleanup {
    std.debug.print("Cleaning up connection {}\n", .{conn});
    return .{ .cleaned = .{} };
}

// Main flow with nested labels
~listen(port: 8080)
| ready s |> #accept_loop accept(server: s)
    | connected c |> #process_loop process(conn: c.conn)
        | done d |> close(conn: d)
            | closed |> @accept_loop(server: c.server)
        | retry r |> @process_loop(conn: r)
        | error e |> log_error(conn: e.conn, msg: e.msg)
            | logged l |> cleanup(conn: l)
                | cleaned |> @accept_loop(server: c.server)
    | failed f |> @accept_loop(server: f)
| failed _ |> _
input.kz