-
Notifications
You must be signed in to change notification settings - Fork 85
/
CommandLineOptionFormatterMark2.cs
136 lines (116 loc) · 3.39 KB
/
CommandLineOptionFormatterMark2.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System;
using System.Globalization;
using System.Linq;
using System.Text;
using Fclp.Internals.Extensions;
namespace Fclp.Internals
{
/// <summary>
///
/// </summary>
public class CommandLineOptionFormatterMark2 : ICommandLineOptionFormatter
{
/// <summary>
///
/// </summary>
public CommandLineOptionFormatterMark2()
{
Header = "Options:";
ValueText = "Value";
DescriptionText = "Description";
NoOptionsText = "No options have been setup";
MinOptionPadding = 2;
LeftPadding = 2;
}
/// <summary>
///
/// </summary>
public const string TextFormat = "\t{0}\t\t{1}\n";
private bool ShowHeader
{
get { return Header != null; }
}
/// <summary>
///
/// </summary>
public string Header { get; set; }
/// <summary>
///
/// </summary>
public string ValueText { get; set; }
/// <summary>
///
/// </summary>
public string DescriptionText { get; set; }
/// <summary>
///
/// </summary>
public string NoOptionsText { get; set; }
/// <summary>
///
/// </summary>
public int MinOptionPadding { get; set; }
/// <summary>
///
/// </summary>
public int LeftPadding { get; set; }
/// <summary>
///
/// </summary>
/// <param name="options"></param>
/// <returns></returns>
public string Format(System.Collections.Generic.IEnumerable<ICommandLineOption> options)
{
if (options == null) throw new ArgumentNullException("options");
var list = options.ToList();
if (!list.Any()) return this.NoOptionsText;
var sb = new StringBuilder();
sb.AppendLine();
// add headers first
if (ShowHeader)
{
sb.AppendLine(Header);
sb.AppendLine();
}
var ordered = (from option in list
orderby option.ShortName.IsNullOrWhiteSpace() == false descending, option.ShortName
select option).ToList();
var minPadding = FindLongestLongOption(list) + MinOptionPadding;
foreach (var cmdOption in ordered)
AppendWithPadding(sb, FormatValue(cmdOption), cmdOption.Description, minPadding);
return sb.ToString();
}
static int FindLongestLongOption(System.Collections.Generic.IEnumerable<ICommandLineOption> options)
{
return options.Select(option => FormatValue(option).Length).OrderByDescending(len => len).First();
}
void AppendWithPadding(StringBuilder sb, string optionText, string descriptionText, int minOptionPadding)
{
var requiredPadding = minOptionPadding - optionText.Length;
var leftPadding = new string(' ', LeftPadding);
var optionPadding = new string(' ', requiredPadding);
sb.AppendFormat(CultureInfo.CurrentUICulture, "{0}{1}{2}{3}\n", leftPadding, optionText, optionPadding, descriptionText);
}
///
static string FormatValue(ICommandLineOption cmdOption)
{
if (cmdOption.ShortName.IsNullOrWhiteSpace())
{
return FormatLong(cmdOption.LongName);
}
if (cmdOption.LongName.IsNullOrWhiteSpace())
{
return FormatShort(cmdOption.ShortName);
}
return FormatShort(cmdOption.ShortName) + ", " + FormatLong(cmdOption.LongName);
}
static string FormatShort(string shortOption)
{
return "-" + shortOption;
}
static string FormatLong(string longOption)
{
return "--" + longOption;
}
}
}