Example #1
0
        public static void Help(Type t_cfg)
        {
            var asm = t_cfg == null ? null : t_cfg.Assembly;

            if (t_cfg != null)
            {
                var @params = t_cfg.GetProperties(BF.AllInstance)
                              .Where(p => p.HasAttr <ParamAttribute>()).OrderBy(p => p.Attr <ParamAttribute>().Priority).ToReadOnly();

                var cfg_name = t_cfg.Attr <ConfigAttribute>().Name ?? asm.GetName().Name;
                var s_syntax = String.Format("Syntax: {0}", cfg_name);
                foreach (var p in @params)
                {
                    var is_optional = t_cfg.GetProperty("Default" + p.Name, BF.AllStatic) != null;
                    var alias       = p.Attr <ParamAttribute>().Aliases.First();
                    s_syntax += String.Format(" {0}-{1}:{2}{3}", is_optional ? "[" : "", alias, p.Name, is_optional ? "]" : "");
                }
                s_syntax += " [/verbose]";
                Console.WriteLine(s_syntax);

                var shortcuts = t_cfg.Attrs <ShortcutAttribute>().OrderBy(shortcut => shortcut.Priority);
                if (shortcuts.IsNotEmpty())
                {
                    Console.EnsureBlankLine();
                    if (shortcuts.Count() == 1)
                    {
                        Console.WriteLine("Shortcut: ");
                    }
                    else
                    {
                        Console.WriteLine("Shortcuts:"); Console.Write("    ");
                    }

                    shortcuts.ForEach((shortcut, i) =>
                    {
                        shortcut.Description.AssertNull();
                        Console.WriteLine(cfg_name + (shortcut.Schema.IsNullOrEmpty() ? "" : (" " + shortcut.Schema)));
                        if (i != shortcuts.Count() - 1)
                        {
                            Console.Write("    ");
                        }
                    });
                }

                Console.EnsureBlankLine();
                Console.WriteLine("Parameters:");
                var max_name = @params.MaxOrDefault(p => p.Name.Length);
                max_name = Math.Max("/verbose".Length, max_name);
                var feed     = new String(' ', 4 + 1 + max_name + 2);
                var max_desc = 80 - feed.Length;
                (max_desc > 0).AssertTrue();
                Action <String, String> write_name_desc = (name, desc) =>
                {
                    Console.Write(String.Format("    {0}{1}{2}  ",
                                                name.StartsWith("/") ? "" : "%",
                                                name.PadRight(max_name),
                                                name.StartsWith("/") ? " " : ""));

                    var num_lines = (int)Math.Ceiling(1.0 * desc.Length / max_desc);
                    for (var i = 0; i < num_lines; ++i)
                    {
                        if (i != 0)
                        {
                            Console.Write(feed);
                        }
                        var line = desc.Substring(i * max_desc, Math.Min(max_desc, desc.Length - i * max_desc));
                        Console.WriteLine(line);
                    }
                };
                foreach (var p in @params)
                {
                    var desc = p.Attr <ParamAttribute>().Description ?? String.Empty;

                    var p_default = t_cfg.GetProperty("Default" + p.Name, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
                    if (p_default != null)
                    {
                        var default_value = p_default.GetValue(null, null);
                        if (default_value != null)
                        {
                            var s_default_value = default_value == null ? "null" : default_value.ToString();
                            if (default_value is DirectoryInfo)
                            {
                                var dir = default_value as DirectoryInfo;
                                if (dir.FullName == Environment.CurrentDirectory)
                                {
                                    s_default_value = "current dir";
                                }
                            }

                            var s_default = String.Format("Defaults to {0}.", s_default_value);
                            if (!String.IsNullOrEmpty(desc))
                            {
                                if (!desc.EndsWith("."))
                                {
                                    desc += ".";
                                }
                                desc += " ";
                            }
                            desc += s_default;
                        }
                    }

                    if (!String.IsNullOrEmpty(desc))
                    {
                        write_name_desc(p.Name, desc);
                    }
                }
                write_name_desc("/verbose", "Turns verbose tracing on, useful for debugging.");
            }
        }