Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

leverage ITuple interface #1733

Merged
merged 6 commits into from Aug 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nblumhardt

i wasnt sure if 8 was a by design choice? or u just didnt want to bloat the conversion code with too many tuple conversions.

if it is by design, let me know and i will make the ITuple respect this

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not by design - I think dropping this limitation is good 👍

{
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 @@ -39,6 +39,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>