/
OptionSwitches.cs
136 lines (116 loc) · 4.09 KB
/
OptionSwitches.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.Collections.Generic;
using System.Linq;
using System.Text;
using OptionParser.Exceptions;
using OptionParser.CommonTypes;
namespace OptionParser
{
public abstract class AbstractSwitches
{
private static char[] delimiters = new char[] { ' ' };
// Struct for switches string
private List<string> switchesList = new List<string>();
#region Properties
// Return all switches as array of array of string
public string[] Switches { get { return switchesList.ToArray(); } }
// Return count of switches
public int Count { get { return switchesList.Count; } }
#endregion
#region Parse Method
protected void ParseSwicthesString(string switchesString)
{
string[] switches = switchesString.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
foreach (var sw in switches)
{
if (switchesList.Contains(sw))
{
throw new ArgumentException("Prepinace se opakuji");
}
else
{
switchesList.Add(sw);
}
}
}
#endregion
#region Help generator
public abstract string ToHelp(OptionArity arity, AbstractType valueType);
#endregion
}
public class ShortSwitches : AbstractSwitches
{
public ShortSwitches(string switchesString)
{
ParseSwicthesString(switchesString);
}
#region Help generator
public override string ToHelp(OptionArity arity, AbstractType valueType)
{
StringBuilder help = new StringBuilder();
foreach (var sw in Switches)
{
help.AppendFormat("-{0}, ", sw);
}
return help.ToString();
}
#endregion
}
public class LongSwitches : AbstractSwitches
{
public LongSwitches(string switchesString)
{
ParseSwicthesString(switchesString);
}
#region Help generator
public override string ToHelp(OptionArity arity, AbstractType valueType)
{
StringBuilder help = new StringBuilder();
StringBuilder postfix = new StringBuilder();
if (arity.MinimalOccurs == 0)
{
postfix.AppendFormat("[={0}]", valueType);
}
foreach (var sw in Switches)
{
help.AppendFormat("--{0}{1} ", sw, postfix);
}
return help.ToString();
}
#endregion
}
public class SwitchesManager
{
public ShortSwitches Short { get; private set; }
public LongSwitches Long { get; private set; }
public SwitchesManager(string shortSwitchesString, string longSwitchesString, OptionArity optionArity, AbstractType valueType)
{
bool intersectionIsEmpty = SwitchesIntersectionIsEmpty(shortSwitchesString, longSwitchesString);
if (intersectionIsEmpty)
{
Short = new ShortSwitches(shortSwitchesString);
Long = new LongSwitches(longSwitchesString);
}
else
{
throw new DuplicitOptionSwitchException("");
}
}
#region Help generator
public string ToHelp(OptionArity arity, AbstractType valueType)
{
StringBuilder help = new StringBuilder();
help.AppendFormat("{0}, {1}", Short.ToHelp(arity, valueType), Long.ToHelp(arity, valueType) );
return help.ToString();
}
#endregion
private bool SwitchesIntersectionIsEmpty(string switchesA, string switchesB)
{
char[] delimiters = new char[] { ' ' };
string[] a = switchesA.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
string[] b = switchesB.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
int intersectionSize = a.Where(s => b.Contains(s)).Count();
return intersectionSize == 0;
}
}
}