1
0

LogStringHandler.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System.Runtime.CompilerServices;
  2. namespace Content.Shared.Administration.Logs;
  3. [InterpolatedStringHandler]
  4. public ref struct LogStringHandler
  5. {
  6. private DefaultInterpolatedStringHandler _handler;
  7. public readonly Dictionary<string, object?> Values;
  8. public LogStringHandler(int literalLength, int formattedCount)
  9. {
  10. _handler = new DefaultInterpolatedStringHandler(literalLength, formattedCount);
  11. Values = new Dictionary<string, object?>();
  12. }
  13. public LogStringHandler(int literalLength, int formattedCount, IFormatProvider? provider)
  14. {
  15. _handler = new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider);
  16. Values = new Dictionary<string, object?>();
  17. }
  18. public LogStringHandler(int literalLength, int formattedCount, IFormatProvider? provider, Span<char> initialBuffer)
  19. {
  20. _handler = new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, initialBuffer);
  21. Values = new Dictionary<string, object?>();
  22. }
  23. private void AddFormat<T>(string? format, T value, string? argument = null)
  24. {
  25. if (format == null)
  26. {
  27. if (argument == null)
  28. {
  29. return;
  30. }
  31. format = argument[0] == '@' ? argument[1..] : argument;
  32. }
  33. if (Values.TryAdd(format, value) ||
  34. Values[format] == (object?) value)
  35. {
  36. return;
  37. }
  38. var originalFormat = format;
  39. var i = 2;
  40. format = $"{originalFormat}_{i}";
  41. while (!Values.TryAdd(format, value))
  42. {
  43. format = $"{originalFormat}_{i}";
  44. i++;
  45. }
  46. }
  47. public void AppendLiteral(string value)
  48. {
  49. _handler.AppendLiteral(value);
  50. }
  51. public void AppendFormatted<T>(T value, [CallerArgumentExpression("value")] string? argument = null)
  52. {
  53. AddFormat(null, value, argument);
  54. _handler.AppendFormatted(value);
  55. }
  56. public void AppendFormatted<T>(T value, string? format, [CallerArgumentExpression("value")] string? argument = null)
  57. {
  58. AddFormat(format, value, argument);
  59. _handler.AppendFormatted(value, format);
  60. }
  61. public void AppendFormatted<T>(T value, int alignment, [CallerArgumentExpression("value")] string? argument = null)
  62. {
  63. AddFormat(null, value, argument);
  64. _handler.AppendFormatted(value, alignment);
  65. }
  66. public void AppendFormatted<T>(T value, int alignment, string? format, [CallerArgumentExpression("value")] string? argument = null)
  67. {
  68. AddFormat(format, value, argument);
  69. _handler.AppendFormatted(value, alignment, format);
  70. }
  71. public void AppendFormatted(ReadOnlySpan<char> value)
  72. {
  73. _handler.AppendFormatted(value);
  74. }
  75. // ReSharper disable once MethodOverloadWithOptionalParameter
  76. public void AppendFormatted(ReadOnlySpan<char> value, int alignment = 0, string? format = null)
  77. {
  78. AddFormat(format, value.ToString());
  79. _handler.AppendFormatted(value, alignment, format);
  80. }
  81. public void AppendFormatted(string? value)
  82. {
  83. _handler.AppendFormatted(value);
  84. }
  85. // ReSharper disable once MethodOverloadWithOptionalParameter
  86. public void AppendFormatted(string? value, int alignment = 0, string? format = null)
  87. {
  88. AddFormat(format, value);
  89. _handler.AppendFormatted(value, alignment, format);
  90. }
  91. public void AppendFormatted(object? value, int alignment = 0, string? format = null)
  92. {
  93. AddFormat(null, value, format);
  94. _handler.AppendFormatted(value, alignment, format);
  95. }
  96. public string ToStringAndClear()
  97. {
  98. Values.Clear();
  99. return _handler.ToStringAndClear();
  100. }
  101. }