using System.Collections.Generic; using System.Text; namespace TweetDuck.Data{ sealed class CommandLineArgs{ public static CommandLineArgs FromStringArray(char entryChar, string[] array){ CommandLineArgs args = new CommandLineArgs(); ReadStringArray(entryChar, array, args); return args; } public static void ReadStringArray(char entryChar, string[] array, CommandLineArgs targetArgs){ for(int index = 0; index < array.Length; index++){ string entry = array[index]; if (entry.Length > 0 && entry[0] == entryChar){ if (index < array.Length-1){ string potentialValue = array[index+1]; if (potentialValue.Length > 0 && potentialValue[0] == entryChar){ targetArgs.AddFlag(entry); } else{ targetArgs.SetValue(entry, potentialValue); ++index; } } else{ targetArgs.AddFlag(entry); } } } } private readonly HashSet<string> flags = new HashSet<string>(); private readonly Dictionary<string, string> values = new Dictionary<string, string>(); public int Count => flags.Count+values.Count; public void AddFlag(string flag){ flags.Add(flag.ToLower()); } public bool HasFlag(string flag){ return flags.Contains(flag.ToLower()); } public void RemoveFlag(string flag){ flags.Remove(flag.ToLower()); } public void SetValue(string key, string value){ values[key.ToLower()] = value; } public bool HasValue(string key){ return values.ContainsKey(key.ToLower()); } public string GetValue(string key, string defaultValue){ return values.TryGetValue(key.ToLower(), out string val) ? val : defaultValue; } public void RemoveValue(string key){ values.Remove(key.ToLower()); } public CommandLineArgs Clone(){ CommandLineArgs copy = new CommandLineArgs(); foreach(string flag in flags){ copy.AddFlag(flag); } foreach(KeyValuePair<string, string> kvp in values){ copy.SetValue(kvp.Key, kvp.Value); } return copy; } public void ToDictionary(IDictionary<string, string> target){ foreach(string flag in flags){ target[flag] = "1"; } foreach(KeyValuePair<string, string> kvp in values){ target[kvp.Key] = kvp.Value; } } public override string ToString(){ StringBuilder build = new StringBuilder(); foreach(string flag in flags){ build.Append(flag).Append(' '); } foreach(KeyValuePair<string, string> kvp in values){ build.Append(kvp.Key).Append(" \"").Append(kvp.Value).Append("\" "); } return build.Length == 0 ? string.Empty : build.Remove(build.Length-1, 1).ToString(); } } }