From bed99cf1b1e484ca182f08857ad8d5723129c13c Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Wed, 31 Aug 2022 09:08:05 +1000 Subject: [PATCH] leverage ITuple interface (#1733) * leverage ITuple interface * IVALUETUPLE * resolve merge conflict * missed a conflict * const should be ITUPLE --- .../Capturing/PropertyValueConverter.cs | 44 +++++++++++++++---- src/Serilog/Serilog.csproj | 2 +- .../Capturing/PropertyValueConverterTests.cs | 4 ++ test/Serilog.Tests/Serilog.Tests.csproj | 2 +- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/Serilog/Capturing/PropertyValueConverter.cs b/src/Serilog/Capturing/PropertyValueConverter.cs index e7a2f2993..639b0141f 100644 --- a/src/Serilog/Capturing/PropertyValueConverter.cs +++ b/src/Serilog/Capturing/PropertyValueConverter.cs @@ -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 @@ -241,8 +241,33 @@ IEnumerable 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(); + 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; @@ -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; diff --git a/src/Serilog/Serilog.csproj b/src/Serilog/Serilog.csproj index c9cf204c3..9fe653d6a 100644 --- a/src/Serilog/Serilog.csproj +++ b/src/Serilog/Serilog.csproj @@ -45,7 +45,7 @@ - $(DefineConstants);ASYNCLOCAL;HASHTABLE;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY;VALUETUPLE + $(DefineConstants);ASYNCLOCAL;HASHTABLE;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY;VALUETUPLE;ITUPLE diff --git a/test/Serilog.Tests/Capturing/PropertyValueConverterTests.cs b/test/Serilog.Tests/Capturing/PropertyValueConverterTests.cs index 40f52c060..24048d405 100644 --- a/test/Serilog.Tests/Capturing/PropertyValueConverterTests.cs +++ b/test/Serilog.Tests/Capturing/PropertyValueConverterTests.cs @@ -396,6 +396,8 @@ public void AllTupleLengthsUpToSevenAreSupportedForCapturing() Assert.IsType(_converter.CreatePropertyValue(t)); } +#if !ITUPLE + [Fact] public void EightPlusValueTupleElementsAreIgnoredByCapturing() { @@ -403,6 +405,8 @@ public void EightPlusValueTupleElementsAreIgnoredByCapturing() Assert.IsType(scalar); } +#endif + [Fact] public void ValueTupleDestructuringIsTransitivelyApplied() { diff --git a/test/Serilog.Tests/Serilog.Tests.csproj b/test/Serilog.Tests/Serilog.Tests.csproj index 8f9112883..8c5c7c810 100644 --- a/test/Serilog.Tests/Serilog.Tests.csproj +++ b/test/Serilog.Tests/Serilog.Tests.csproj @@ -38,6 +38,6 @@ $(DefineConstants);ASYNCLOCAL;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN - $(DefineConstants);ASYNCLOCAL;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY + $(DefineConstants);ASYNCLOCAL;FEATURE_DEFAULT_INTERFACE;FEATURE_SPAN;FEATURE_DATE_AND_TIME_ONLY;ITUPLE