예제 #1
0
            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);
            }
예제 #2
0
        // 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();
        }
예제 #3
0
        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);
                }
            });
        }
예제 #6
0
 protected FubuCommand()
 {
     _usages = new UsageGraph(GetType());
 }