Skip to content

Commit e0bb296

Browse files
authored
Merge pull request #11 from nblumhardt/tt
Fix $type round-tripping
2 parents daa05f1 + 7e83f36 commit e0bb296

File tree

3 files changed

+28
-35
lines changed

3 files changed

+28
-35
lines changed

src/Serilog.Formatting.Compact.Reader/LogEventReader.cs

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ namespace Serilog.Formatting.Compact.Reader
2929
/// </summary>
3030
public class LogEventReader : IDisposable
3131
{
32-
static readonly MessageTemplateParser _parser = new MessageTemplateParser();
32+
static readonly MessageTemplateParser Parser = new MessageTemplateParser();
3333
readonly TextReader _text;
3434
readonly JsonSerializer _serializer;
3535

36-
int _lineNumber = 0;
36+
int _lineNumber;
3737

3838
/// <summary>
3939
/// Construct a <see cref="LogEventReader"/>.
@@ -42,9 +42,7 @@ public class LogEventReader : IDisposable
4242
/// <param name="serializer">If specified, a JSON serializer used when converting event documents.</param>
4343
public LogEventReader(TextReader text, JsonSerializer serializer = null)
4444
{
45-
if (text == null) throw new ArgumentNullException(nameof(text));
46-
47-
_text = text;
45+
_text = text ?? throw new ArgumentNullException(nameof(text));
4846
_serializer = serializer ?? CreateSerializer();
4947
}
5048

@@ -126,26 +124,25 @@ static LogEvent ReadFromJObject(int lineNumber, JObject jObject)
126124
}
127125

128126
var level = LogEventLevel.Information;
129-
string l;
130-
if (TryGetOptionalField(lineNumber, jObject, ClefFields.Level, out l))
127+
if (TryGetOptionalField(lineNumber, jObject, ClefFields.Level, out string l))
131128
level = (LogEventLevel)Enum.Parse(typeof(LogEventLevel), l);
132129
Exception exception = null;
133-
string ex;
134-
if (TryGetOptionalField(lineNumber, jObject, ClefFields.Exception, out ex))
130+
if (TryGetOptionalField(lineNumber, jObject, ClefFields.Exception, out string ex))
135131
exception = new TextException(ex);
136132

137133
var unrecognized = jObject.Properties().Where(p => ClefFields.IsUnrecognized(p.Name));
134+
// ReSharper disable once PossibleMultipleEnumeration
138135
if (unrecognized.Any())
139136
{
137+
// ReSharper disable once PossibleMultipleEnumeration
140138
var names = string.Join(", ", unrecognized.Select(p => $"`{p.Name}`"));
141139
throw new InvalidDataException($"{names} on line {lineNumber} are unrecognized.");
142140
}
143141

144-
var parsedTemplate = _parser.Parse(messageTemplate);
142+
var parsedTemplate = Parser.Parse(messageTemplate);
145143
var renderings = Enumerable.Empty<Rendering>();
146144

147-
JToken r;
148-
if (jObject.TryGetValue(ClefFields.Renderings, out r))
145+
if (jObject.TryGetValue(ClefFields.Renderings, out JToken r))
149146
{
150147
var renderedByIndex = r as JArray;
151148
if (renderedByIndex == null)
@@ -178,15 +175,6 @@ static LogEvent ReadFromJObject(int lineNumber, JObject jObject)
178175
return new LogEvent(timestamp, level, exception, parsedTemplate, properties);
179176
}
180177

181-
static string GetRequiredField(int lineNumber, JObject data, string field)
182-
{
183-
string value;
184-
if (!TryGetOptionalField(lineNumber, data, field, out value))
185-
throw new InvalidDataException($"The data on line {lineNumber} does not include the required `{field}` field.");
186-
187-
return value;
188-
}
189-
190178
static bool TryGetOptionalField(int lineNumber, JObject data, string field, out string value)
191179
{
192180
JToken token;
@@ -214,8 +202,8 @@ static DateTimeOffset GetRequiredTimestampField(int lineNumber, JObject data, st
214202
var dt = token.Value<JValue>().Value;
215203
if (dt is DateTimeOffset)
216204
return (DateTimeOffset)dt;
217-
else
218-
return (DateTime)dt;
205+
206+
return (DateTime)dt;
219207
}
220208

221209
if (token.Type != JTokenType.String)

src/Serilog.Formatting.Compact.Reader/PropertyFactory.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414

1515
using Newtonsoft.Json.Linq;
1616
using Serilog.Events;
17-
using System;
1817
using System.Collections.Generic;
1918
using System.Linq;
20-
using System.Threading.Tasks;
2119

2220
namespace Serilog.Formatting.Compact.Reader
2321
{
2422
static class PropertyFactory
2523
{
24+
const string TypeTagPropertyName = "$type";
25+
2626
public static LogEventProperty CreateProperty(string name, JToken value, IEnumerable<Rendering> renderings)
2727
{
2828
return new LogEventProperty(name, CreatePropertyValue(value, renderings));
@@ -33,28 +33,23 @@ static LogEventPropertyValue CreatePropertyValue(JToken value, IEnumerable<Rende
3333
if (value.Type == JTokenType.Null)
3434
return new ScalarValue(null);
3535

36-
var obj = value as JObject;
37-
if (obj != null)
36+
if (value is JObject obj)
3837
{
3938
JToken tt;
40-
obj.TryGetValue("$typeTag", out tt);
39+
obj.TryGetValue(TypeTagPropertyName, out tt);
4140
return new StructureValue(
42-
obj.Properties().Where(kvp => kvp.Name != "$typeTag").Select(kvp => CreateProperty(kvp.Name, kvp.Value, null)),
41+
obj.Properties().Where(kvp => kvp.Name != TypeTagPropertyName).Select(kvp => CreateProperty(kvp.Name, kvp.Value, null)),
4342
tt?.Value<string>());
4443
}
4544

46-
var arr = value as JArray;
47-
if (arr != null)
45+
if (value is JArray arr)
4846
{
4947
return new SequenceValue(arr.Select(v => CreatePropertyValue(v, null)));
5048
}
5149

5250
var raw = value.Value<JValue>().Value;
5351

54-
if (renderings != null)
55-
return new RenderableScalarValue(raw, renderings);
56-
57-
return new ScalarValue(raw);
52+
return renderings != null ? new RenderableScalarValue(raw, renderings) : new ScalarValue(raw);
5853
}
5954
}
6055
}

test/Serilog.Formatting.Compact.Reader.Tests/LogEventReaderTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,15 @@ public void HandlesDefaultJsonNetSerialization()
6161

6262
Assert.Equal(DateTimeOffset.Parse("2016-10-12T04:20:58.0554314Z"), evt.Timestamp);
6363
}
64+
65+
[Fact]
66+
public void RoundTripsTypeTags()
67+
{
68+
const string document = "{\"@t\":\"2016-10-12T04:20:58.0554314Z\",\"@m\":\"Hello\",\"User\":{\"$type\":\"TestUser\",\"Name\":\"nblumhardt\"}}";
69+
var evt = LogEventReader.ReadFromString(document);
70+
71+
var user = (StructureValue)evt.Properties["User"];
72+
Assert.Equal("TestUser", user.TypeTag);
73+
}
6474
}
6575
}

0 commit comments

Comments
 (0)