Nenhuma descrição
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

NameAndParameters.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. ////REVIEW: why is this public?
  6. ////TODO: add array support
  7. ////TODO: switch parsing to use to Substring
  8. namespace UnityEngine.InputSystem.Utilities
  9. {
  10. /// <summary>
  11. /// A combination of a name and an optional list of named parameter values. For example, "Clamp(min=1,max=2)".
  12. /// </summary>
  13. public struct NameAndParameters
  14. {
  15. public string name { get; set; }
  16. public ReadOnlyArray<NamedValue> parameters { get; set; }
  17. public override string ToString()
  18. {
  19. if (parameters.Count == 0)
  20. return name;
  21. var parameterString = string.Join(NamedValue.Separator, parameters.Select(x => x.ToString()).ToArray());
  22. return $"{name}({parameterString})";
  23. }
  24. public static IEnumerable<NameAndParameters> ParseMultiple(string text)
  25. {
  26. List<NameAndParameters> list = null;
  27. if (!ParseMultiple(text, ref list))
  28. return Enumerable.Empty<NameAndParameters>();
  29. return list;
  30. }
  31. internal static bool ParseMultiple(string text, ref List<NameAndParameters> list)
  32. {
  33. text = text.Trim();
  34. if (string.IsNullOrEmpty(text))
  35. return false;
  36. if (list == null)
  37. list = new List<NameAndParameters>();
  38. else
  39. list.Clear();
  40. var index = 0;
  41. var textLength = text.Length;
  42. while (index < textLength)
  43. list.Add(ParseNameAndParameters(text, ref index));
  44. return true;
  45. }
  46. internal static string ParseName(string text)
  47. {
  48. if (text == null)
  49. throw new ArgumentNullException(nameof(text));
  50. var index = 0;
  51. return ParseNameAndParameters(text, ref index, true).name;
  52. }
  53. public static NameAndParameters Parse(string text)
  54. {
  55. if (text == null)
  56. throw new ArgumentNullException(nameof(text));
  57. var index = 0;
  58. return ParseNameAndParameters(text, ref index);
  59. }
  60. private static NameAndParameters ParseNameAndParameters(string text, ref int index, bool nameOnly = false)
  61. {
  62. var textLength = text.Length;
  63. // Skip whitespace.
  64. while (index < textLength && char.IsWhiteSpace(text[index]))
  65. ++index;
  66. // Parse name.
  67. var nameStart = index;
  68. while (index < textLength)
  69. {
  70. var nextChar = text[index];
  71. if (nextChar == '(' || nextChar == NamedValue.Separator[0] || char.IsWhiteSpace(nextChar))
  72. break;
  73. ++index;
  74. }
  75. if (index - nameStart == 0)
  76. throw new ArgumentException($"Expecting name at position {nameStart} in '{text}'", nameof(text));
  77. var name = text.Substring(nameStart, index - nameStart);
  78. if (nameOnly)
  79. return new NameAndParameters {name = name};
  80. // Skip whitespace.
  81. while (index < textLength && char.IsWhiteSpace(text[index]))
  82. ++index;
  83. // Parse parameters.
  84. NamedValue[] parameters = null;
  85. if (index < textLength && text[index] == '(')
  86. {
  87. ++index;
  88. var closeParenIndex = text.IndexOf(')', index);
  89. if (closeParenIndex == -1)
  90. throw new ArgumentException($"Expecting ')' after '(' at position {index} in '{text}'", nameof(text));
  91. var parameterString = text.Substring(index, closeParenIndex - index);
  92. parameters = NamedValue.ParseMultiple(parameterString);
  93. index = closeParenIndex + 1;
  94. }
  95. if (index < textLength && (text[index] == ',' || text[index] == InputBinding.Separator))
  96. ++index;
  97. return new NameAndParameters {name = name, parameters = new ReadOnlyArray<NamedValue>(parameters)};
  98. }
  99. }
  100. }