using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using Argument = System.Collections.Generic.KeyValuePair; namespace PleoLab { /// /// Allows to manipulate arguments for a command line. /// public class CommandArguments : IEnumerable { private Dictionary _arguments = new Dictionary(); public string ArgumentFormatString { get; set; } public string ArgumentWithNullValueFormatString { get; set; } public string ArrayValuesSeparator { get; set; } public bool EnumArgumentsInLowerCase { get; set; } public bool QuoteArgumentsWithWhiteSpaces { get; set; } public string Separator { get; set; } public CommandArguments() { ArgumentFormatString = "{0}={1}"; ArgumentWithNullValueFormatString = "{0}"; ArrayValuesSeparator = " "; QuoteArgumentsWithWhiteSpaces = true; Separator = ";"; } /// /// Returns a copy of the arguments. /// public virtual CommandArguments Clone() { var clone = (CommandArguments)MemberwiseClone(); clone._arguments = new Dictionary(_arguments); return clone; } public T Get(string parameterName) { string value; if (_arguments.TryGetValue(parameterName, out value)) { return ConvertFromString(value); } return default(T); } public T Get(string parameterName, params string[] aliases) { string value; if (_arguments.TryGetValue(parameterName, out value)) { return ConvertFromString(value); } foreach (var alias in aliases) { if (_arguments.TryGetValue(alias, out value)) { return ConvertFromString(value); } } return default(T); } public void Set(string parameterName, T value) { _arguments[parameterName] = ConvertToString(value); } public void Reset(string parameterName) { _arguments.Remove(parameterName); } public void Set(string parameterName, string value) { if (!string.IsNullOrEmpty(value)) { _arguments[parameterName] = ConvertToString(value); } else { _arguments.Remove(parameterName); } } public void Set(string parameterName, T? value) where T : struct { if (value != null) { _arguments[parameterName] = ConvertToString(value); } else { _arguments.Remove(parameterName); } } public void SetFlag(string parameterName, bool isSet) { if (isSet) { _arguments[parameterName] = null; } else { _arguments.Remove(parameterName); } } public bool IsFlagSet(string parameterName) { return _arguments.ContainsKey(parameterName); } public void Set(IEnumerable arguments) { foreach (var argument in arguments) { Set(argument.Key, argument.Value); } } public void Set(string parameterName) { _arguments[parameterName] = null; } protected virtual string ConvertToString(object value) { var result = (value ?? "").ToString(); if (value is Enum && EnumArgumentsInLowerCase) { result = result.ToLower(); } if (QuoteArgumentsWithWhiteSpaces && result.Contains(" ")) { result = Quote(result); } if (value is string[]) { result = string.Join(ArrayValuesSeparator, ((string[])value).Select(ConvertToString)); } return result; } protected virtual T ConvertFromString(string value) { var converter = TypeDescriptor.GetConverter(typeof(T)); return (T)converter.ConvertFrom(value); } protected string Quote(object value) { const string quote = "\""; return string.Concat(quote, value, quote); } protected virtual string FormatArgument(Argument argument) { if (string.IsNullOrEmpty(argument.Value)) { return string.Format(ArgumentWithNullValueFormatString, argument.Key); } return string.Format(ArgumentFormatString, argument.Key, argument.Value); } public override string ToString() { return string.Join(Separator, _arguments.Select(FormatArgument)); } public IEnumerator GetEnumerator() { return _arguments.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }