004 auto discharge

✓ Passing This code compiles and runs correctly.

Code

// Test: Auto-discharge cleans up undischarged handles at request end
// With auto_discharge: true, interpreter calls discharge events automatically

~import "$std/runtime"
~import "$std/io"

const std = @import("std");

~pub event open { path: []const u8 }
| opened { handle: []const u8[opened!] }

~proc open {
    return .{ .opened = .{ .handle = "file_1" } };
}

~pub event close { handle: []const u8[!opened] }
| closed {}

~proc close {
    std.debug.print("close() was called by auto-discharge\n", .{});
    return .{ .closed = .{} };
}

~std.runtime:register(scope: "test") {
    open(10)
    close(1)
}

const TEST_SOURCE = "~open(path: \"test.txt\")\n| opened f |> result { status: \"done\" }";

// Open file but DON'T close - auto-discharge should clean up
~std.runtime:run(source: TEST_SOURCE, scope: "test", budget: 100, auto_discharge: true)
| result _ |> std.io:println(text: "PASS: auto-discharge ran")
| exhausted _ |> std.io:println(text: "FAIL: should not exhaust")
| parse_error _ |> std.io:println(text: "PARSE ERROR")
| validation_error _ |> std.io:println(text: "VALIDATION ERROR")
| event_denied _ |> std.io:println(text: "EVENT DENIED")
| dispatch_error _ |> std.io:println(text: "DISPATCH ERROR")
| scope_not_found _ |> std.io:println(text: "SCOPE NOT FOUND")
input.kz

Expected Output

close() was called by auto-discharge
[AUTO-DISCHARGE] Invoked 'close' for handle 'file_1' [main:opened]
PASS: auto-discharge ran

Test Configuration

MUST_RUN