From 9e6609ba690524601b25390189be4aa7d863b415 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Fri, 5 Apr 2019 18:55:16 +1000 Subject: [PATCH] Fix evaluation of filters that return structure or sequence values --- .../Expressions/Runtime/Representation.cs | 17 ++++++++++++++--- .../FilterExpressionCompilerTests.cs | 13 ++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Serilog.Filters.Expressions/Filters/Expressions/Runtime/Representation.cs b/src/Serilog.Filters.Expressions/Filters/Expressions/Runtime/Representation.cs index 7b83c08..f745df2 100644 --- a/src/Serilog.Filters.Expressions/Filters/Expressions/Runtime/Representation.cs +++ b/src/Serilog.Filters.Expressions/Filters/Expressions/Runtime/Representation.cs @@ -44,12 +44,12 @@ public static object Expose(object internalValue) var sequence = internalValue as SequenceValue; if (sequence != null) - return sequence.Elements.Select(Expose).ToArray(); + return sequence.Elements.Select(ExposeOrRepresent).ToArray(); var structure = internalValue as StructureValue; if (structure != null) { - var r = structure.Properties.ToDictionary(p => p.Name, p => Expose(p.Value)); + var r = structure.Properties.ToDictionary(p => p.Name, p => ExposeOrRepresent(p.Value)); if (structure.TypeTag != null) r["$type"] = structure.TypeTag; return r; @@ -58,12 +58,23 @@ public static object Expose(object internalValue) var dictionary = internalValue as DictionaryValue; if (dictionary != null) { - return dictionary.Elements.ToDictionary(p => Expose(p.Key), p => Expose(p.Value)); + return dictionary.Elements.ToDictionary(p => ExposeOrRepresent(p.Key), p => ExposeOrRepresent(p.Value)); } return internalValue; } + static object ExposeOrRepresent(object internalValue) + { + if (internalValue is Undefined) + return null; + + if (internalValue is ScalarValue sv) + return Represent(sv); + + return Expose(internalValue); + } + public static LogEventPropertyValue Recapture(object value) { return value is LogEventPropertyValue lepv ? lepv : new ScalarValue(value); diff --git a/test/Serilog.Filters.Expressions.Tests/FilterExpressionCompilerTests.cs b/test/Serilog.Filters.Expressions.Tests/FilterExpressionCompilerTests.cs index 105ab83..12028be 100644 --- a/test/Serilog.Filters.Expressions.Tests/FilterExpressionCompilerTests.cs +++ b/test/Serilog.Filters.Expressions.Tests/FilterExpressionCompilerTests.cs @@ -1,4 +1,5 @@ -using Serilog.Events; +using System.Collections.Generic; +using Serilog.Events; using Serilog.Filters.Expressions.Tests.Support; using System.Linq; using Xunit; @@ -150,5 +151,15 @@ static void AssertFiltering(string expression, LogEvent match, params LogEvent[] Assert.Single(sink.Events); Assert.Same(match, sink.Events.Single()); } + + [Fact] + public void StructuresAreExposedAsDictionaries() + { + var evt = Some.InformationEvent("{@Person}", new { Name = "nblumhardt" }); + var expr = FilterLanguage.CreateFilter("Person"); + var val = expr(evt); + var dict = Assert.IsType>(val); + Assert.Equal("nblumhardt", dict["Name"]); + } } }