LogValuesFormatter
Formatter to convert the named format items like {NamedformatItem} to Format format.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Text;
namespace Microsoft.Extensions.Logging
{
[NullableContext(1)]
[Nullable(0)]
internal sealed class LogValuesFormatter
{
private const string NullValue = "(null)";
private readonly List<string> _valueNames = new List<string>();
private readonly CompositeFormat _format;
public string OriginalFormat { get; }
public List<string> ValueNames => _valueNames;
public unsafe LogValuesFormatter(string format)
{
ArgumentNullException.ThrowIfNull(format, "format");
OriginalFormat = format;
Span<char> initialBuffer = new Span<char>(stackalloc byte[512], 256);
System.Text.ValueStringBuilder valueStringBuilder = new System.Text.ValueStringBuilder(initialBuffer);
int num = 0;
int length = format.Length;
while (num < length) {
int num2 = FindBraceIndex(format, '{', num, length);
if (num == 0 && num2 == length) {
_format = CompositeFormat.Parse(format);
return;
}
int num3 = FindBraceIndex(format, '}', num2, length);
if (num3 == length) {
valueStringBuilder.Append(format.AsSpan(num, length - num));
num = length;
} else {
int num4 = format.AsSpan(num2, num3 - num2).IndexOfAny(',', ':');
num4 = ((num4 < 0) ? num3 : (num4 + num2));
valueStringBuilder.Append(format.AsSpan(num, num2 - num + 1));
valueStringBuilder.Append(_valueNames.Count.ToString());
_valueNames.Add(format.Substring(num2 + 1, num4 - num2 - 1));
valueStringBuilder.Append(format.AsSpan(num4, num3 - num4 + 1));
num = num3 + 1;
}
}
_format = CompositeFormat.Parse(valueStringBuilder.ToString());
}
private static int FindBraceIndex(string format, char brace, int startIndex, int endIndex)
{
int result = endIndex;
int i = startIndex;
int num = 0;
for (; i < endIndex; i++) {
if (num > 0 && format[i] != brace) {
if (num % 2 != 0)
break;
num = 0;
result = endIndex;
} else if (format[i] == brace) {
if (brace == '}') {
if (num == 0)
result = i;
} else
result = i;
num++;
}
}
return result;
}
public string Format([Nullable(2)] object[] values)
{
object[] array = values;
if (values != null) {
for (int i = 0; i < values.Length; i++) {
object obj = FormatArgument(values[i]);
if (obj != values[i]) {
array = new object[values.Length];
Array.Copy(values, array, i);
array[i++] = obj;
for (; i < values.Length; i++) {
array[i] = FormatArgument(values[i]);
}
break;
}
}
}
return string.Format(CultureInfo.InvariantCulture, _format, array ?? Array.Empty<object>());
}
internal string FormatWithOverwrite([Nullable(2)] object[] values)
{
if (values != null) {
for (int i = 0; i < values.Length; i++) {
values[i] = FormatArgument(values[i]);
}
}
return string.Format(CultureInfo.InvariantCulture, _format, values ?? Array.Empty<object>());
}
internal string Format()
{
return _format.Format;
}
internal string Format<[Nullable(2)] TArg0>(TArg0 arg0)
{
if (TryFormatArgumentIfNullOrEnumerable(arg0, out object stringValue)) {
CultureInfo invariantCulture = CultureInfo.InvariantCulture;
CompositeFormat format = _format;
object reference = stringValue;
return string.Format(invariantCulture, format, new ReadOnlySpan<object>(ref reference));
}
return string.Format(CultureInfo.InvariantCulture, _format, arg0);
}
internal string Format<[Nullable(2)] TArg0, [Nullable(2)] TArg1>(TArg0 arg0, TArg1 arg1)
{
if (!(TryFormatArgumentIfNullOrEnumerable(arg0, out object stringValue) | TryFormatArgumentIfNullOrEnumerable(arg1, out object stringValue2)))
return string.Format(CultureInfo.InvariantCulture, _format, arg0, arg1);
CultureInfo invariantCulture = CultureInfo.InvariantCulture;
CompositeFormat format = _format;
global::<>y__InlineArray2<object> buffer = default(global::<>y__InlineArray2<object>);
global::<PrivateImplementationDetails>.InlineArrayElementRef<global::<>y__InlineArray2<object>, object>(ref buffer, 0) = (stringValue ?? ((object)arg0));
global::<PrivateImplementationDetails>.InlineArrayElementRef<global::<>y__InlineArray2<object>, object>(ref buffer, 1) = (stringValue2 ?? ((object)arg1));
return string.Format(invariantCulture, format, global::<PrivateImplementationDetails>.InlineArrayAsReadOnlySpan<global::<>y__InlineArray2<object>, object>(ref buffer, 2));
}
internal string Format<[Nullable(2)] TArg0, [Nullable(2)] TArg1, [Nullable(2)] TArg2>(TArg0 arg0, TArg1 arg1, TArg2 arg2)
{
if (!(TryFormatArgumentIfNullOrEnumerable(arg0, out object stringValue) | TryFormatArgumentIfNullOrEnumerable(arg1, out object stringValue2) | TryFormatArgumentIfNullOrEnumerable(arg2, out object stringValue3)))
return string.Format(CultureInfo.InvariantCulture, _format, arg0, arg1, arg2);
CultureInfo invariantCulture = CultureInfo.InvariantCulture;
CompositeFormat format = _format;
global::<>y__InlineArray3<object> buffer = default(global::<>y__InlineArray3<object>);
global::<PrivateImplementationDetails>.InlineArrayElementRef<global::<>y__InlineArray3<object>, object>(ref buffer, 0) = (stringValue ?? ((object)arg0));
global::<PrivateImplementationDetails>.InlineArrayElementRef<global::<>y__InlineArray3<object>, object>(ref buffer, 1) = (stringValue2 ?? ((object)arg1));
global::<PrivateImplementationDetails>.InlineArrayElementRef<global::<>y__InlineArray3<object>, object>(ref buffer, 2) = (stringValue3 ?? ((object)arg2));
return string.Format(invariantCulture, format, global::<PrivateImplementationDetails>.InlineArrayAsReadOnlySpan<global::<>y__InlineArray3<object>, object>(ref buffer, 3));
}
[return: Nullable(new byte[] {
0,
1,
2
})]
public KeyValuePair<string, object> GetValue([Nullable(new byte[] {
1,
2
})] object[] values, int index)
{
if (index < 0 || index > _valueNames.Count)
throw new IndexOutOfRangeException("index");
if (_valueNames.Count > index)
return new KeyValuePair<string, object>(_valueNames[index], values[index]);
return new KeyValuePair<string, object>("{OriginalFormat}", OriginalFormat);
}
[return: Nullable(new byte[] {
1,
0,
1,
2
})]
public IEnumerable<KeyValuePair<string, object>> GetValues(object[] values)
{
KeyValuePair<string, object>[] array = new KeyValuePair<string, object>[values.Length + 1];
for (int i = 0; i != _valueNames.Count; i++) {
array[i] = new KeyValuePair<string, object>(_valueNames[i], values[i]);
}
array[array.Length - 1] = new KeyValuePair<string, object>("{OriginalFormat}", OriginalFormat);
return array;
}
private static object FormatArgument(object value)
{
if (!TryFormatArgumentIfNullOrEnumerable(value, out object stringValue))
return value;
return stringValue;
}
private unsafe static bool TryFormatArgumentIfNullOrEnumerable<T>(T value, [NotNullWhen(true)] out object stringValue)
{
if (value == null) {
stringValue = "(null)";
return true;
}
if (!(((object)value) is string)) {
IEnumerable enumerable = value as IEnumerable;
if (enumerable != null) {
Span<char> initialBuffer = new Span<char>((void*)stackalloc byte[512], 256);
System.Text.ValueStringBuilder valueStringBuilder = new System.Text.ValueStringBuilder(initialBuffer);
bool flag = true;
foreach (object item in enumerable) {
if (!flag)
valueStringBuilder.Append(", ");
valueStringBuilder.Append((item != null) ? item.ToString() : "(null)");
flag = false;
}
stringValue = valueStringBuilder.ToString();
return true;
}
}
stringValue = null;
return false;
}
}
}