Exemple #1
0
        private static ConsoleString GetOptionsUsage(IEnumerable <CommandLineArgument> opts, bool ignoreActionProperties, ArgUsageOptions options)
        {
            if (opts.Count() == 0)
            {
                return(new ConsoleString("There are no options\n"));
            }

            var usageInfos = opts.Select(o => new ArgumentUsageInfo(o));

            var hasPositionalArgs = usageInfos.Where(i => i.Position >= 0).Count() > 0;

            List <ConsoleString> columnHeaders = new List <ConsoleString>()
            {
                new ConsoleString("OPTION", ConsoleColor.Yellow),
                new ConsoleString("DESCRIPTION", ConsoleColor.Yellow),
            };

            bool hasTypeCol = false, hasPosCol = false;

            int insertPosition = 1;

            if (options.ShowType)
            {
                columnHeaders.Insert(insertPosition++, new ConsoleString("TYPE", ConsoleColor.Yellow));
                hasTypeCol = true;
            }

            if (hasPositionalArgs && options.ShowPosition)
            {
                columnHeaders.Insert(insertPosition, new ConsoleString("POSITION", ConsoleColor.Yellow));
                hasPosCol = true;
            }

            List <List <ConsoleString> > rows = new List <List <ConsoleString> >();

            foreach (ArgumentUsageInfo usageInfo in usageInfos.OrderBy(i => i.Position >= 0 ? i.Position : 1000))
            {
                var hooks = new List <UsageHook>();
                if (usageInfo.Property != null && ArgUsage.ExplicitPropertyHooks.ContainsKey(usageInfo.Property))
                {
                    hooks.AddRange(ArgUsage.ExplicitPropertyHooks[usageInfo.Property]);
                }

                hooks.AddRange(ArgUsage.GlobalUsageHooks);

                hooks.AddRange(usageInfo.Argument.UsageHooks);

                foreach (var hook in hooks)
                {
                    hook.BeforeGenerateUsage(usageInfo);
                }


                if (usageInfo.Ignore)
                {
                    continue;
                }
                if (usageInfo.IsAction && ignoreActionProperties)
                {
                    continue;
                }

                var positionString    = new ConsoleString(usageInfo.Position >= 0 ? usageInfo.Position + "" : "NA");
                var requiredString    = new ConsoleString(usageInfo.IsRequired ? "*" : "", ConsoleColor.Red);
                var descriptionString = new ConsoleString(usageInfo.Description);
                if (options.AppendDefaultValueToDescription && usageInfo.DefaultValue != null)
                {
                    descriptionString += new ConsoleString(" [default=" + usageInfo.DefaultValue.ToString() + "]", ConsoleColor.DarkGreen);
                }

                var typeString = new ConsoleString(usageInfo.Type);

                var    aliases = usageInfo.Aliases.OrderBy(a => a.Length).ToList();
                var    maxInlineAliasLength = 8;
                string inlineAliasInfo      = "";

                int aliasIndex;
                for (aliasIndex = 0; aliasIndex < aliases.Count; aliasIndex++)
                {
                    var proposedInlineAliases = inlineAliasInfo == string.Empty ? aliases[aliasIndex] : inlineAliasInfo + ", " + aliases[aliasIndex];
                    if (proposedInlineAliases.Length <= maxInlineAliasLength)
                    {
                        inlineAliasInfo = proposedInlineAliases;
                    }
                    else
                    {
                        break;
                    }
                }

                if (inlineAliasInfo != string.Empty)
                {
                    inlineAliasInfo = " (" + inlineAliasInfo + ")";
                }

                rows.Add(new List <ConsoleString>()
                {
                    new ConsoleString("") + (usageInfo.Name + inlineAliasInfo),
                    descriptionString,
                });

                insertPosition = 1;
                if (options.ShowType)
                {
                    rows.Last().Insert(insertPosition++, typeString + requiredString);
                }

                if (hasPositionalArgs && options.ShowPosition)
                {
                    rows.Last().Insert(insertPosition, positionString);
                }

                for (int i = aliasIndex; i < aliases.Count; i++)
                {
                    rows.Add(new List <ConsoleString>()
                    {
                        new ConsoleString("  " + aliases[i]),
                        ConsoleString.Empty,
                    });

                    if (hasTypeCol)
                    {
                        rows.Last().Add(ConsoleString.Empty);
                    }
                    if (hasPosCol)
                    {
                        rows.Last().Add(ConsoleString.Empty);
                    }
                }

                if (options.ShowPossibleValues)
                {
                    foreach (var possibleValue in usageInfo.PossibleValues)
                    {
                        rows.Add(new List <ConsoleString>()
                        {
                            ConsoleString.Empty,
                            new ConsoleString("  " + possibleValue),
                        });

                        if (hasTypeCol)
                        {
                            rows.Last().Insert(rows.Last().Count - 1, ConsoleString.Empty);
                        }
                        if (hasPosCol)
                        {
                            rows.Last().Insert(rows.Last().Count - 1, ConsoleString.Empty);
                        }
                    }
                }
            }

            return(FormatAsTable(columnHeaders, rows, "   "));
        }
Exemple #2
0
 public static ConsoleString GetStyledUsage(Type t, string exeName = null, ArgUsageOptions options = null)
 {
     return(GetStyledUsage(new CommandLineArgumentsDefinition(t), exeName, options));
 }
Exemple #3
0
        public static ConsoleString GetStyledUsage(CommandLineArgumentsDefinition definition, string exeName = null, ArgUsageOptions options = null)
        {
            if (ArgHook.HookContext.Current != null && ArgHook.HookContext.Current.Definition == definition)
            {
                ArgHook.HookContext.Current.RunBeforePrepareUsage();
            }

            options = options ?? new ArgUsageOptions();
            if (exeName == null)
            {
                var assembly = Assembly.GetEntryAssembly();
                if (assembly == null)
                {
                    throw new InvalidOperationException("PowerArgs could not determine the name of your executable automatically.  This may happen if you run GetUsage<T>() from within unit tests.  Use GetUsageT>(string exeName) in unit tests to avoid this exception.");
                }
                exeName = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location);
            }

            ConsoleString ret = new ConsoleString();

            ret += new ConsoleString("Usage: " + exeName, ConsoleColor.Cyan);


            if (definition.Actions.Count > 0)
            {
                string actionText = options.SpecifiedActionOverride == null ? "<action>" : options.SpecifiedActionOverride.DefaultAlias;
                ret = ret.AppendUsingCurrentFormat(" " + actionText + " options\n");

                foreach (var example in definition.Examples)
                {
                    ret += new ConsoleString("\nEXAMPLE: " + example.Example + "\n" + example.Description + "\n\n", ConsoleColor.DarkGreen);
                }

                if (definition.Arguments.Count > 0)
                {
                    var global = GetOptionsUsage(definition.Arguments, true, options);

                    if (string.IsNullOrEmpty(global.ToString()) == false)
                    {
                        ret += new ConsoleString("\nGlobal options:\n\n", ConsoleColor.Cyan) + global + "\n";
                    }
                }

                var specifiedAction = definition.SpecifiedAction;

                if (options.SpecifiedActionOverride != null)
                {
                    specifiedAction = options.SpecifiedActionOverride;
                    if (definition.Actions.Contains(specifiedAction) == false)
                    {
                        throw new InvalidArgDefinitionException("There is no action that matches '" + options.SpecifiedActionOverride + "'");
                    }
                }

                if (specifiedAction == null)
                {
                    ret += new ConsoleString("Actions:", ConsoleColor.Cyan);
                }

                foreach (var action in definition.Actions)
                {
                    if (specifiedAction != null && action.Equals(specifiedAction) == false)
                    {
                        // The user specified an action so only show the usage for that action
                        continue;
                    }

                    if (string.IsNullOrWhiteSpace(action.Description) == false)
                    {
                        ret += "\n" + action.DefaultAlias + " - " + action.Description + "\n\n";
                    }
                    else
                    {
                        ret += "\n" + action.DefaultAlias + "\n\n";
                    }

                    foreach (var example in action.Examples)
                    {
                        ret += new ConsoleString() + "   EXAMPLE: " + new ConsoleString(example.Example + "\n", ConsoleColor.Green) +
                               new ConsoleString("   " + example.Description + "\n\n", ConsoleColor.DarkGreen);
                    }

                    ret += GetOptionsUsage(action.Arguments, false, options);
                }
            }
            else
            {
                ret = ret.AppendUsingCurrentFormat(" options\n\n");

                ret += GetOptionsUsage(definition.Arguments, false, options);

                ret += "\n";

                foreach (var example in definition.Examples)
                {
                    ret += new ConsoleString() + "   EXAMPLE: " + new ConsoleString(example.Example + "\n", ConsoleColor.Green) +
                           new ConsoleString("   " + example.Description + "\n\n", ConsoleColor.DarkGreen);
                }
            }

            return(ret);
        }
Exemple #4
0
 public static ConsoleString GetStyledUsage <T>(string exeName = null, ArgUsageOptions options = null)
 {
     return(GetStyledUsage(typeof(T), exeName, options));
 }
Exemple #5
0
 public static string GetUsage(CommandLineArgumentsDefinition definition, string exeName = null, ArgUsageOptions options = null)
 {
     return(GetStyledUsage(definition, exeName, options).ToString());
 }
Exemple #6
0
 public static string GetUsage <T>(string exeName = null, ArgUsageOptions options = null)
 {
     return(GetStyledUsage <T>(exeName, options).ToString());
 }
Exemple #7
0
        private static ConsoleString GetOptionsUsage(IEnumerable <PropertyInfo> opts, bool ignoreActionProperties, ArgUsageOptions options)
        {
            var usageInfos = opts.Select(o => new ArgumentUsageInfo(o));

            var hasPositionalArgs = usageInfos.Where(i => i.Position >= 0).Count() > 0;

            List <ConsoleString> columnHeaders = new List <ConsoleString>()
            {
                new ConsoleString("OPTION", ConsoleColor.Yellow),
                new ConsoleString("DESCRIPTION", ConsoleColor.Yellow),
            };

            int insertPosition = 1;

            if (options.ShowType)
            {
                columnHeaders.Insert(insertPosition++, new ConsoleString("TYPE", ConsoleColor.Yellow));
            }

            if (hasPositionalArgs && options.ShowPosition)
            {
                columnHeaders.Insert(insertPosition, new ConsoleString("POSITION", ConsoleColor.Yellow));
            }

            List <List <ConsoleString> > rows = new List <List <ConsoleString> >();

            foreach (ArgumentUsageInfo usageInfo in usageInfos.OrderBy(i => i.Position >= 0 ? i.Position : 1000))
            {
                foreach (var hook in usageInfo.Property.GetUsageHooks())
                {
                    hook.BeforeGenerateUsage(usageInfo);
                }

                if (usageInfo.Ignore)
                {
                    continue;
                }
                if (usageInfo.IsAction && ignoreActionProperties)
                {
                    continue;
                }
                if (usageInfo.IsActionArgs && ignoreActionProperties)
                {
                    continue;
                }

                var positionString    = new ConsoleString(usageInfo.Position >= 0 ? usageInfo.Position + "" : "NA");
                var requiredString    = new ConsoleString(usageInfo.IsRequired ? "*" : "", ConsoleColor.Red);
                var descriptionString = new ConsoleString(usageInfo.Description);
                var typeString        = new ConsoleString(usageInfo.Type);

                var indicator = "-";

                rows.Add(new List <ConsoleString>()
                {
                    new ConsoleString(indicator) + (usageInfo.Name + (usageInfo.Aliases.Count > 0 ? " (" + usageInfo.Aliases[0] + ")" : "")),
                    descriptionString,
                });

                insertPosition = 1;
                if (options.ShowType)
                {
                    rows.Last().Insert(insertPosition++, typeString + requiredString);
                }

                if (hasPositionalArgs && options.ShowPosition)
                {
                    rows.Last().Insert(insertPosition, positionString);
                }

                for (int i = 1; i < usageInfo.Aliases.Count; i++)
                {
                    rows.Add(new List <ConsoleString>()
                    {
                        new ConsoleString("    " + usageInfo.Aliases[i]),
                        ConsoleString.Empty,
                        ConsoleString.Empty,
                    });

                    if (hasPositionalArgs)
                    {
                        rows.Last().Insert(2, positionString);
                    }
                }
            }

            return(FormatAsTable(columnHeaders, rows, "   "));
        }
Exemple #8
0
        /// <summary>
        /// Generates color styled usage documentation for the given argument scaffold type.
        /// </summary>
        /// <typeparam name="T">Your custom argument scaffold type</typeparam>
        /// <param name="exeName">The name of your program or null if you want PowerArgs to automatically detect it.</param>
        /// <param name="options">Specify custom usage options</param>
        /// <returns></returns>
        public static ConsoleString GetStyledUsage <T>(string exeName = null, ArgUsageOptions options = null)
        {
            options = options ?? new ArgUsageOptions();
            if (exeName == null)
            {
                var assembly = Assembly.GetEntryAssembly();
                if (assembly == null)
                {
                    throw new ArgException("PowerArgs could not determine the name of your executable automatically.  This may happen if you run GetUsage<T>() from within unit tests.  Use GetUsageT>(string exeName) in unit tests to avoid this exception.");
                }
                exeName = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location);
            }

            ConsoleString ret = new ConsoleString();

            ret += new ConsoleString("Usage: " + exeName, ConsoleColor.Cyan);

            var actionProperty = ArgAction.GetActionProperty <T>();

            if (actionProperty != null)
            {
                ret.AppendUsingCurrentFormat(" <action> options\n\n");

                foreach (var example in typeof(T).Attrs <ArgExample>())
                {
                    ret += new ConsoleString("EXAMPLE: " + example.Example + "\n" + example.Description + "\n\n", ConsoleColor.DarkGreen);
                }

                var global = GetOptionsUsage(typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public), true, options);

                if (string.IsNullOrEmpty(global.ToString()) == false)
                {
                    ret += new ConsoleString("Global options:\n\n", ConsoleColor.Cyan) + global + "\n";
                }

                ret += "Actions:";

                foreach (PropertyInfo prop in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public))
                {
                    if (prop.IsActionArgProperty() == false)
                    {
                        continue;
                    }

                    var actionDescription = prop.HasAttr <ArgDescription>() ? " - " + prop.Attr <ArgDescription>().Description : "";

                    ret += "\n\n" + prop.GetArgumentName().Substring(0, prop.GetArgumentName().Length - Constants.ActionArgConventionSuffix.Length) + actionDescription + "\n\n";

                    foreach (var example in prop.Attrs <ArgExample>())
                    {
                        ret += new ConsoleString() + "   EXAMPLE: " + new ConsoleString(example.Example + "\n", ConsoleColor.Green) +
                               new ConsoleString("   " + example.Description + "\n\n", ConsoleColor.DarkGreen);
                    }

                    ret += GetOptionsUsage(prop.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public), false, options);
                }
            }
            else
            {
                ret.AppendUsingCurrentFormat(" options\n\n");

                ret += GetOptionsUsage(typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public), false, options);

                ret += "\n";

                foreach (var example in typeof(T).Attrs <ArgExample>())
                {
                    ret += new ConsoleString() + "   EXAMPLE: " + new ConsoleString(example.Example + "\n", ConsoleColor.Green) +
                           new ConsoleString("   " + example.Description + "\n\n", ConsoleColor.DarkGreen);
                }
            }

            return(ret);
        }