4 // Author: Rafael Teixeira (rafaelteixeirabr@hotmail.com)
6 // (C) 2002 Rafael Teixeira
10 using System.Collections;
12 using System.Reflection;
14 namespace Mono.GetOptions
16 public enum WhatToDoNext
22 internal class OptionDetails : IComparable
24 public char ShortForm;
25 public string LongForm;
26 public string ShortDescription;
27 public bool NeedsParameter;
28 public int MaxOccurs; // negative means there is no limit
30 public Options OptionBundle;
31 public MemberInfo MemberInfo;
32 public ArrayList Values;
33 public System.Type ParameterType;
35 public override string ToString()
38 // TODO: Yet not that good
40 optionHelp += (this.ShortForm != ' ') ? "-"+this.ShortForm+" " : " ";
41 optionHelp += (this.LongForm != string.Empty && this.LongForm != null) ? "--"+this.LongForm : "";
44 if (this.LongForm != string.Empty && this.LongForm != null)
45 optionHelp += "=PARAM";
47 optionHelp += "PARAM";
49 optionHelp = optionHelp.PadRight(23) + " ";
50 optionHelp += this.ShortDescription;
54 private static System.Type TypeOfMember(MemberInfo memberInfo)
56 if ((memberInfo.MemberType == MemberTypes.Field && memberInfo is FieldInfo))
57 return ((FieldInfo)memberInfo).FieldType;
59 if ((memberInfo.MemberType == MemberTypes.Property && memberInfo is PropertyInfo))
60 return ((PropertyInfo)memberInfo).PropertyType;
62 if ((memberInfo.MemberType == MemberTypes.Method && memberInfo is MethodInfo))
64 if (((MethodInfo)memberInfo).ReturnType.FullName != typeof(WhatToDoNext).FullName)
65 throw new NotSupportedException("Option method must return '" + typeof(WhatToDoNext).FullName + "'");
67 ParameterInfo[] parameters = ((MethodInfo)memberInfo).GetParameters();
68 if ((parameters == null) || (parameters.Length == 0))
71 return parameters[0].ParameterType;
74 throw new NotSupportedException("'" + memberInfo.MemberType + "' memberType is not supportted");
77 public OptionDetails(MemberInfo memberInfo, OptionAttribute option, Options optionBundle)
79 this.ShortForm = option.ShortForm;
80 this.LongForm = (option.LongForm == string.Empty)? memberInfo.Name:option.LongForm;
81 this.ShortDescription = option.ShortDescription;
83 this.OptionBundle = optionBundle;
84 this.MemberInfo = memberInfo;
85 this.NeedsParameter = false;
88 this.ParameterType = TypeOfMember(memberInfo);
90 if (this.ParameterType != null && this.ParameterType.FullName != "System.Boolean")
92 this.NeedsParameter = true;
93 if (this.ParameterType.IsArray)
95 this.Values = new ArrayList();
96 this.MaxOccurs = option.MaxOccurs;
100 if (this.MemberInfo is MethodInfo)
101 this.MaxOccurs = option.MaxOccurs;
108 get { return ((this.ShortForm != ' ') ? this.ShortForm + "" : "") + this.LongForm; }
111 int IComparable.CompareTo(object other)
113 return Key.CompareTo(((OptionDetails)other).Key);
116 public void TransferValues()
120 if (MemberInfo is FieldInfo)
122 ((FieldInfo)MemberInfo).SetValue(OptionBundle, Values.ToArray(ParameterType.GetElementType()));
126 if (MemberInfo is PropertyInfo)
128 ((PropertyInfo)MemberInfo).SetValue(OptionBundle, Values.ToArray(ParameterType.GetElementType()), null);
132 if ((WhatToDoNext)((MethodInfo)MemberInfo).Invoke(OptionBundle, new object[] { Values.ToArray(ParameterType.GetElementType()) }) == WhatToDoNext.AbandonProgram)
133 System.Environment.Exit(1);
137 private void DoIt(string parameter)
141 if (MaxOccurs > 0 && Occurs > MaxOccurs)
142 throw new IndexOutOfRangeException("Option " + ShortForm + " can be used at most " + MaxOccurs + " times");
146 if (MemberInfo is FieldInfo)
148 ((FieldInfo)MemberInfo).SetValue(OptionBundle, true);
151 if (MemberInfo is PropertyInfo)
153 ((PropertyInfo)MemberInfo).SetValue(OptionBundle, true, null);
156 if ((WhatToDoNext)((MethodInfo)MemberInfo).Invoke(OptionBundle, null) == WhatToDoNext.AbandonProgram)
157 System.Environment.Exit(1);
162 object convertedParameter = null;
164 if (Values != null && parameter != null)
166 convertedParameter = Convert.ChangeType(parameter, ParameterType.GetElementType());
167 Values.Add(convertedParameter);
171 if (parameter != null)
172 convertedParameter = Convert.ChangeType(parameter, ParameterType);
174 if (MemberInfo is FieldInfo)
176 ((FieldInfo)MemberInfo).SetValue(OptionBundle, convertedParameter);
180 if (MemberInfo is PropertyInfo)
182 ((PropertyInfo)MemberInfo).SetValue(OptionBundle, convertedParameter, null);
186 if ((WhatToDoNext)((MethodInfo)MemberInfo).Invoke(OptionBundle, new object[] { convertedParameter }) == WhatToDoNext.AbandonProgram)
187 System.Environment.Exit(1);
190 public bool ProcessArgument(string arg, string nextArg)
192 if (arg == ("-" + ShortForm) || arg == ("--" + LongForm))