namespace Agent.App.Cli; public enum AppCommand { Serve, Check } public sealed record CommandLine(AppCommand Command, string? ConfigPath, string? Language, string? Transport) { public static CommandLine Parse(string[] args) { if (args.Length == 0) throw new CommandLineException("Expected 'serve' or 'check'."); AppCommand command = args[0] switch { "serve" => AppCommand.Serve, "check" => AppCommand.Check, _ => throw new CommandLineException("Expected 'serve' or 'check'.") }; string? config = null; string? language = null; string? transport = null; for (int i = 1; i < args.Length; i++) { string option = args[i]; if (i + 1 >= args.Length) throw new CommandLineException($"Missing value for '{option}'."); string value = args[++i]; switch (option) { case "--config" when config is null: config = value; break; case "--lang" when language is null: language = value; break; case "--transport" when command == AppCommand.Serve && transport is null && value is "stdio" or "http": transport = value; break; case "--transport" when command == AppCommand.Check: throw new CommandLineException("--transport is only valid for serve."); case "--transport": throw new CommandLineException("Transport must be stdio or http."); default: throw new CommandLineException($"Unknown or duplicate option '{option}'."); } } return new CommandLine(command, config, language, transport); } } public sealed class CommandLineException(string message) : Exception(message);