public UsageExpression(UsageGraph parent, string description) { _parent = parent; _commandUsage = new CommandUsage { Description = description, Arguments = new Argument[0], ValidFlags = _parent.Handlers.Where(x => !x.GetType().CanBeCastTo <Argument>()).ToArray() // Hokum. }; _parent._usages.Add(_commandUsage); }
// TODO: Refactor. To much stuff going on in here. public string[] Build(string[] args) { if (args == null) throw new ArgumentNullException("args"); if (args.Any()) return args; var appName = factory.GetAppName(); Console.WriteLine("Available Commands:"); var allCommandTypes = factory.AllCommandTypes().OrderBy(x => x.Name); for (var i = 0; i < allCommandTypes.Count(); i++) { var commandOption = allCommandTypes.ElementAt(i); Console.WriteLine("{0}. {1} - {2}", i + 1, commandOption.Name, new UsageGraph(appName, commandOption).Description); } Console.Write("Please select a command to run: "); var commandToRunNumber = Console.ReadLine(); var command = allCommandTypes.ElementAt(int.Parse(commandToRunNumber) - 1); var usageGraph = new UsageGraph(appName, command); var commandName = usageGraph.CommandName; var argsAsStrings = new List<string> { commandName }; if (commandName.Contains("help")) return argsAsStrings.ToArray(); foreach (var handler in usageGraph.Handlers) { Console.Write(handler.PromptForArg()); var arg = Console.ReadLine(); Console.WriteLine(); if (string.IsNullOrEmpty(arg)) continue; var flag = handler as Flag; var booleanFlag = handler as BooleanFlag; if (flag != null) { argsAsStrings.Add(flag.ConvertPromptArg()); } if (booleanFlag != null) { arg = booleanFlag.ConvertPromptArg(arg); } argsAsStrings.Add(arg); } return argsAsStrings.ToArray(); }
private CommandRun buildRun(Queue <string> queue, string commandName) { var command = Build(commandName); // this is where we'll call into UsageGraph? try { var usageGraph = new UsageGraph(_appName, _commandTypes[commandName]); var input = usageGraph.BuildInput(queue); return(new CommandRun { Command = command, Input = input }); } catch (InvalidUsageException e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Invalid usage"); if (e.Message.IsNotEmpty()) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(e.Message); } Console.ResetColor(); Console.WriteLine(); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error parsing input"); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(e); Console.ResetColor(); Console.WriteLine(); } return(HelpRun(commandName)); }
private CommandRun buildRun(Queue<string> queue, string commandName) { var command = Build(commandName); // this is where we'll call into UsageGraph? try { var usageGraph = new UsageGraph(_appName, _commandTypes[commandName]); var input = usageGraph.BuildInput(queue); return new CommandRun { Command = command, Input = input }; } catch (InvalidUsageException e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Invalid usage"); if (e.Message.IsNotEmpty()) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(e.Message); } Console.ResetColor(); Console.WriteLine(); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error parsing input"); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(e); Console.ResetColor(); Console.WriteLine(); } return HelpRun(commandName); }
public void all_commands_usage_graph_works() { var factory = new CommandFactory(); factory.RegisterCommands(typeof(AliasCommand).Assembly); factory.RegisterCommands(typeof(IFubuCommand).Assembly); factory.AllCommandTypes().Each(t => { try { var usageGraph = new UsageGraph(t); usageGraph.WriteUsages(); Assert.IsTrue(usageGraph.Usages.Any(), "Found usages for " + t.FullName); } catch (Exception e) { throw new ApplicationException("Command type: " + t.FullName, e); } }); }
protected FubuCommand() { _usages = new UsageGraph(GetType()); }