in src/NuGet.Clients/NuGet.VisualStudio.Internal.Contracts/Formatters/ILogMessageFormatter.cs [43:251]
public ILogMessage? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
{
if (reader.TryReadNil())
{
return null;
}
// stack overflow mitigation - see https://github.com/neuecc/MessagePack-CSharp/security/advisories/GHSA-7q36-4xx7-xcxf
options.Security.DepthStep(ref reader);
try
{
NuGetLogCode? code = null;
int? endColumnNumber = null;
int? endLineNumber = null;
string? filePath = null;
string? libraryId = null;
LogLevel? logLevel = null;
string? message = null;
string? projectPath = null;
bool? shouldDisplay = null;
int? startColumnNumber = null;
int? startLineNumber = null;
IReadOnlyList<string> targetGraphs = Array.Empty<string>();
DateTimeOffset? time = null;
string? typeName = null;
WarningLevel? warningLevel = null;
int propertyCount = reader.ReadMapHeader();
for (var propertyIndex = 0; propertyIndex < propertyCount; ++propertyIndex)
{
switch (reader.ReadString())
{
case CodePropertyName:
code = options.Resolver.GetFormatter<NuGetLogCode>()!.Deserialize(ref reader, options);
break;
case EndColumnNumberPropertyName:
endColumnNumber = reader.ReadInt32();
break;
case EndLineNumberPropertyName:
endLineNumber = reader.ReadInt32();
break;
case FilePathPropertyName:
filePath = reader.ReadString();
break;
case LevelPropertyName:
logLevel = options.Resolver.GetFormatter<LogLevel>()!.Deserialize(ref reader, options);
break;
case LibraryIdPropertyName:
libraryId = reader.ReadString();
break;
case MessagePropertyName:
message = reader.ReadString();
break;
case ProjectPathPropertyName:
projectPath = reader.ReadString();
break;
case ShouldDisplayPropertyName:
shouldDisplay = reader.ReadBoolean();
break;
case StartColumnNumberPropertyName:
startColumnNumber = reader.ReadInt32();
break;
case StartLineNumberPropertyName:
startLineNumber = reader.ReadInt32();
break;
case TargetGraphsPropertyName:
if (!reader.TryReadNil())
{
var list = new List<string>();
int targetGraphsCount = reader.ReadArrayHeader();
for (var i = 0; i < targetGraphsCount; ++i)
{
string? targetGraph = reader.ReadString();
if (targetGraph != null)
{
list.Add(targetGraph);
}
}
targetGraphs = list;
}
break;
case TimePropertyName:
time = options.Resolver.GetFormatter<DateTimeOffset>()!.Deserialize(ref reader, options);
break;
case TypeNamePropertyName:
typeName = reader.ReadString();
break;
case WarningLevelPropertyName:
warningLevel = options.Resolver.GetFormatter<WarningLevel>()!.Deserialize(ref reader, options);
break;
default:
reader.Skip();
break;
}
}
Assumes.NotNullOrEmpty(typeName);
Assumes.True(code.HasValue);
Assumes.True(logLevel.HasValue);
Assumes.NotNull(message);
Assumes.True(time.HasValue);
Assumes.True(warningLevel.HasValue);
ILogMessage? logMessage = null;
if (typeName == LogMessageTypeName)
{
logMessage = new LogMessage(logLevel.Value, message)
{
Code = code.Value,
ProjectPath = projectPath,
Time = time.Value,
WarningLevel = warningLevel.Value
};
}
else if (typeName == PackagingLogMessageTypeName)
{
Assumes.True(endColumnNumber.HasValue);
Assumes.True(endLineNumber.HasValue);
Assumes.True(startColumnNumber.HasValue);
Assumes.True(startLineNumber.HasValue);
PackagingLogMessage packagingLogMessage = PackagingLogMessage.CreateError(message, code.Value);
packagingLogMessage.Code = code.Value;
packagingLogMessage.EndColumnNumber = endColumnNumber.Value;
packagingLogMessage.EndLineNumber = endLineNumber.Value;
packagingLogMessage.FilePath = filePath;
packagingLogMessage.Level = logLevel.Value;
packagingLogMessage.ProjectPath = projectPath;
packagingLogMessage.StartColumnNumber = startColumnNumber.Value;
packagingLogMessage.StartLineNumber = startLineNumber.Value;
packagingLogMessage.Time = time.Value;
packagingLogMessage.WarningLevel = warningLevel.Value;
logMessage = packagingLogMessage;
}
else if (typeName == RestoreLogMessageTypeName)
{
Assumes.True(endColumnNumber.HasValue);
Assumes.True(endLineNumber.HasValue);
Assumes.True(shouldDisplay.HasValue);
Assumes.True(startColumnNumber.HasValue);
Assumes.True(startLineNumber.HasValue);
logMessage = new RestoreLogMessage(logLevel.Value, message)
{
Code = code.Value,
EndColumnNumber = endColumnNumber.Value,
EndLineNumber = endLineNumber.Value,
FilePath = filePath,
Level = logLevel.Value,
LibraryId = libraryId,
Message = message,
ProjectPath = projectPath,
ShouldDisplay = shouldDisplay.Value,
StartColumnNumber = startColumnNumber.Value,
StartLineNumber = startLineNumber.Value,
TargetGraphs = targetGraphs,
Time = time.Value,
WarningLevel = warningLevel.Value
};
}
else if (typeName == SignatureLogTypeName)
{
SignatureLog signatureLog = SignatureLog.Error(code.Value, message);
signatureLog.Code = code.Value;
signatureLog.Level = logLevel.Value;
signatureLog.LibraryId = libraryId;
signatureLog.ProjectPath = projectPath;
signatureLog.Time = time.Value;
signatureLog.WarningLevel = warningLevel.Value;
logMessage = signatureLog;
}
else
{
throw new InvalidOperationException();
}
return logMessage;
}
finally
{
// stack overflow mitigation - see https://github.com/neuecc/MessagePack-CSharp/security/advisories/GHSA-7q36-4xx7-xcxf
reader.Depth--;
}
}