Skip to content

Commit

Permalink
leverage ITuple interface (#1733)
Browse files Browse the repository at this point in the history
* leverage ITuple interface

* IVALUETUPLE

* resolve merge conflict

* missed a conflict

* const should be ITUPLE
  • Loading branch information
SimonCropp committed Aug 30, 2022
1 parent 5a69b46 commit bed99cf
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 10 deletions.
44 changes: 36 additions & 8 deletions src/Serilog/Capturing/PropertyValueConverter.cs
Expand Up @@ -168,22 +168,22 @@ LogEventPropertyValue CreatePropertyValue(object? value, Destructuring destructu
}
}

var valueType = value.GetType();

if (TryConvertEnumerable(value, destructuring, valueType, out var enumerableResult))
if (TryConvertEnumerable(value, destructuring, out var enumerableResult))
return enumerableResult;

if (TryConvertValueTuple(value, destructuring, valueType, out var tupleResult))
if (TryConvertValueTuple(value, destructuring, out var tupleResult))
return tupleResult;

if (TryConvertCompilerGeneratedType(value, destructuring, valueType, out var compilerGeneratedResult))
if (TryConvertCompilerGeneratedType(value, destructuring, out var compilerGeneratedResult))
return compilerGeneratedResult;

return new ScalarValue(value.ToString() ?? "");
}

bool TryConvertEnumerable(object value, Destructuring destructuring, Type valueType, [NotNullWhen(true)] out LogEventPropertyValue? result)
bool TryConvertEnumerable(object value, Destructuring destructuring, [NotNullWhen(true)] out LogEventPropertyValue? result)
{
var valueType = value.GetType();

if (value is IEnumerable enumerable)
{
// Only dictionaries with 'scalar' keys are permitted, as
Expand Down Expand Up @@ -241,8 +241,33 @@ IEnumerable<LogEventPropertyValue> MapToSequenceElements(IEnumerable sequence, D
return false;
}

bool TryConvertValueTuple(object value, Destructuring destructuring, Type valueType, [NotNullWhen(true)] out LogEventPropertyValue? result)
#if ITUPLE

bool TryConvertValueTuple(object value, Destructuring destructuring, [NotNullWhen(true)] out LogEventPropertyValue? result)
{
if (value is not ITuple tuple)
{
result = null;
return false;
}

var elements = new List<LogEventPropertyValue>();
for (var i = 0; i < tuple.Length; i++)
{
var fieldValue = tuple[i];
var propertyValue = _depthLimiter.CreatePropertyValue(fieldValue, destructuring);
elements.Add(propertyValue);
}

result = new SequenceValue(elements);
return true;
}

#else

bool TryConvertValueTuple(object value, Destructuring destructuring, [NotNullWhen(true)] out LogEventPropertyValue? result)
{
var valueType = value.GetType();
if (!(value is IStructuralEquatable && valueType.IsConstructedGenericType))
{
result = null;
Expand Down Expand Up @@ -288,8 +313,11 @@ bool TryConvertValueTuple(object value, Destructuring destructuring, Type valueT
return false;
}

bool TryConvertCompilerGeneratedType(object value, Destructuring destructuring, Type valueType, [NotNullWhen(true)] out LogEventPropertyValue? result)
#endif

bool TryConvertCompilerGeneratedType(object value, Destructuring destructuring, [NotNullWhen(true)] out LogEventPropertyValue? result)
{
var valueType = value.GetType();
if (destructuring == Destructuring.Destructure)
{
var typeTag = valueType.Name;
Expand Down
2 changes: 1 addition & 1 deletion src/Serilog/Serilog.csproj
Expand Up @@ -45,7 +45,7 @@
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
<DefineConstants>$(DefineConstants);ASYNCLOCAL;HASHTABLE;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY;VALUETUPLE</DefineConstants>
<DefineConstants>$(DefineConstants);ASYNCLOCAL;HASHTABLE;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY;VALUETUPLE;ITUPLE</DefineConstants>
</PropertyGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
Expand Down
4 changes: 4 additions & 0 deletions test/Serilog.Tests/Capturing/PropertyValueConverterTests.cs
Expand Up @@ -396,13 +396,17 @@ public void AllTupleLengthsUpToSevenAreSupportedForCapturing()
Assert.IsType<SequenceValue>(_converter.CreatePropertyValue(t));
}

#if !ITUPLE

[Fact]
public void EightPlusValueTupleElementsAreIgnoredByCapturing()
{
var scalar = _converter.CreatePropertyValue((1, 2, 3, 4, 5, 6, 7, 8));
Assert.IsType<ScalarValue>(scalar);
}

#endif

[Fact]
public void ValueTupleDestructuringIsTransitivelyApplied()
{
Expand Down
2 changes: 1 addition & 1 deletion test/Serilog.Tests/Serilog.Tests.csproj
Expand Up @@ -38,6 +38,6 @@
<DefineConstants>$(DefineConstants);ASYNCLOCAL;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
<DefineConstants>$(DefineConstants);ASYNCLOCAL;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY</DefineConstants>
<DefineConstants>$(DefineConstants);ASYNCLOCAL;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY;ITUPLE</DefineConstants>
</PropertyGroup>
</Project>

0 comments on commit bed99cf

Please sign in to comment.