You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.1 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace IPA
  7. {
  8. public class Arguments
  9. {
  10. public static Arguments Process = new Arguments(Environment.GetCommandLineArgs());
  11. private List<string> positional = new List<string>();
  12. private Dictionary<string, string> longFlags = new Dictionary<string, string>();
  13. private Dictionary<char, string> flags = new Dictionary<char, string>();
  14. private Arguments(string[] args)
  15. {
  16. foreach(var arg in args)
  17. {
  18. if (arg.StartsWith("--"))
  19. { // parse as a long flag
  20. var name = arg.Substring(2); // cut off first two chars
  21. string value = null;
  22. if (name.Contains('='))
  23. {
  24. var spl = name.Split('=');
  25. name = spl[0];
  26. value = string.Join("=", spl, 1, spl.Length-1);
  27. }
  28. longFlags.Add(name, value);
  29. }
  30. else if (arg.StartsWith("-"))
  31. { // parse as flags
  32. var argument = arg.Substring(1); // cut off first char
  33. StringBuilder subBuildState = new StringBuilder();
  34. bool parsingValue = false;
  35. char mainChar = ' ';
  36. foreach (char chr in argument)
  37. {
  38. if (!parsingValue)
  39. {
  40. if (chr == '=')
  41. {
  42. parsingValue = true;
  43. }
  44. else
  45. {
  46. mainChar = chr;
  47. flags.Add(chr, null);
  48. }
  49. }
  50. else
  51. {
  52. if (chr == ',')
  53. {
  54. parsingValue = false;
  55. flags[mainChar] = subBuildState.ToString();
  56. subBuildState = new StringBuilder();
  57. }
  58. else
  59. {
  60. subBuildState.Append(chr);
  61. }
  62. }
  63. }
  64. }
  65. else
  66. { // parse as positional
  67. positional.Add(arg);
  68. }
  69. }
  70. }
  71. public bool HasLongFlag(string flag)
  72. {
  73. return longFlags.ContainsKey(flag);
  74. }
  75. public bool HasFlag(char flag)
  76. {
  77. return flags.ContainsKey(flag);
  78. }
  79. public string GetLongFlagValue(string flag)
  80. {
  81. return longFlags[flag];
  82. }
  83. public string GetFlagValue(char flag)
  84. {
  85. return flags[flag];
  86. }
  87. public IReadOnlyList<string> PositionalArgs => positional;
  88. }
  89. }