prefect server in zig

fix graceful shutdown exit code to be 0

main() now catches errors from runServer/runServicesOnly and returns
cleanly (exit 0) if shutdown_requested is true. this ensures parity
with Python Prefect server behavior.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

+15 -6
+4 -3
scripts/test-graceful-shutdown
··· 136 136 137 137 log(f"found shutdown logs: {found_logs}") 138 138 139 - # note: exit code may be non-zero due to zap/facil.io quirks with SIGTERM 140 - # the important thing is that graceful shutdown occurred 139 + # verify clean exit (must be 0 for parity with Python) 141 140 if exit_code != 0: 142 - log(f"exit code {exit_code} (acceptable - zap/facil.io SIGTERM quirk)") 141 + log(f"non-zero exit code: {exit_code}") 142 + log(f"server output:\n{stdout}") 143 + return False 143 144 144 145 log("graceful shutdown successful!") 145 146 return True
+11 -3
src/main.zig
··· 102 102 stdout.writeAll(help) catch {}; 103 103 } 104 104 105 - pub fn main() !void { 105 + pub fn main() void { 106 106 log.init(); 107 107 108 108 const args = parseArgs(); ··· 113 113 return; 114 114 }, 115 115 .services_only => { 116 - try runServicesOnly(); 116 + runServicesOnly() catch |err| { 117 + if (shutdown_requested) return; // clean shutdown 118 + log.err("server", "fatal: {}", .{err}); 119 + std.process.exit(1); 120 + }; 117 121 }, 118 122 .server => { 119 - try runServer(args.no_services); 123 + runServer(args.no_services) catch |err| { 124 + if (shutdown_requested) return; // clean shutdown 125 + log.err("server", "fatal: {}", .{err}); 126 + std.process.exit(1); 127 + }; 120 128 }, 121 129 } 122 130 }