const std = @import("std"); const zargs = @import("zargs"); // Graphics module configuration const GraphicsConfig = struct { resolution: []const u8 = "1920x1080", fullscreen: bool = false, vsync: bool = true, pub const meta = .{ .resolution = .{ .short = 'r', .help = "Screen resolution" }, .fullscreen = .{ .short = 'f', .help = "Enable fullscreen mode" }, .vsync = .{ .help = "Enable vertical sync" }, }; }; // Audio module configuration const AudioConfig = struct { volume: u32 = 80, muted: bool = false, pub const meta = .{ .volume = .{ .help = "Master volume (0-100)" }, .muted = .{ .short = 'm', .help = "Start with audio muted" }, }; }; // Engine configuration const EngineConfig = struct { log_level: enum { debug, info, warn, error } = .info, config_file: ?[]const u8 = null, pub const meta = .{ .log_level = .{ .help = "Logging level" }, .config_file = .{ .short = 'c', .help = "Load configuration from file" }, }; }; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); const allocator = gpa.allocator(); const args = try std.process.argsAlloc(allocator); defer std.process.argsFree(allocator, args); // Create a shared registry for multiple modules var registry = zargs.ArgumentRegistry.init(allocator); defer registry.deinit(); // Register all module configurations try registry.registerMetadata(GraphicsConfig, "Graphics"); try registry.registerMetadata(AudioConfig, "Audio"); try registry.registerMetadata(EngineConfig, "Engine"); // Parse arguments try zargs.parseArgv(®istry, args); // Check for help if (registry.isHelpRequested()) { const program_name = if (args.len > 0) args[0] else null; const help_text = try zargs.generateHelpText(®istry, allocator, program_name); defer allocator.free(help_text); try std.io.getStdOut().writeAll(help_text); return; } // Populate each module's configuration const graphics = try zargs.populateStruct(GraphicsConfig, ®istry, allocator); const audio = try zargs.populateStruct(AudioConfig, ®istry, allocator); const engine = try zargs.populateStruct(EngineConfig, ®istry, allocator); // Use the configurations const stdout = std.io.getStdOut().writer(); try stdout.print("=== Game Engine Starting ===\n\n", .{}); try stdout.print("Graphics:\n", .{}); try stdout.print(" Resolution: {s}\n", .{graphics.resolution}); try stdout.print(" Fullscreen: {}\n", .{graphics.fullscreen}); try stdout.print(" VSync: {}\n\n", .{graphics.vsync}); try stdout.print("Audio:\n", .{}); try stdout.print(" Volume: {d}%\n", .{audio.volume}); try stdout.print(" Muted: {}\n\n", .{audio.muted}); try stdout.print("Engine:\n", .{}); try stdout.print(" Log Level: {s}\n", .{@tagName(engine.log_level)}); if (engine.config_file) |file| { try stdout.print(" Config File: {s}\n", .{file}); } try stdout.print("\n[Engine initialized successfully]\n", .{}); }