public ILogMessage? Deserialize()

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--;
            }
        }