1 // Copyright (c) Microsoft. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3 
4 using Microsoft.Build.Framework;
5 using Microsoft.Build.Shared;
6 using NuGet.Common;
7 using System.Collections.Generic;
8 using System.Threading.Tasks;
9 
10 using INuGetLogger = NuGet.Common.ILogger;
11 using SdkLoggerBase = Microsoft.Build.Framework.SdkLogger;
12 
13 namespace NuGet.MSBuildSdkResolver
14 {
15     /// <summary>
16     /// An implementation of <see cref="T:NuGet.Common.ILogger" /> that logs messages to an <see cref="T:Microsoft.Build.Framework.SdkLogger" />.
17     /// </summary>
18     /// <inheritdoc />
19     internal class NuGetSdkLogger : INuGetLogger
20     {
21         /// <summary>
22         /// A collection of errors that have been logged.
23         /// </summary>
24         private readonly ICollection<string> _errors;
25 
26         /// <summary>
27         /// A <see cref="SdkLogger"/> to forward events to.
28         /// </summary>
29         private readonly SdkLoggerBase _sdkLogger;
30 
31         /// <summary>
32         /// A collection of warnings that have been logged.
33         /// </summary>
34         private readonly ICollection<string> _warnings;
35 
36         /// <summary>
37         /// Initializes a new instance of the NuGetLogger class.
38         /// </summary>
39         /// <param name="sdkLogger">A <see cref="SdkLogger"/> to forward events to.</param>
40         /// <param name="warnings">A <see cref="ICollection{String}"/> to add logged warnings to.</param>
41         /// <param name="errors">An <see cref="ICollection{String}"/> to add logged errors to.</param>
NuGetSdkLogger(SdkLoggerBase sdkLogger, ICollection<string> warnings, ICollection<string> errors)42         public NuGetSdkLogger(SdkLoggerBase sdkLogger, ICollection<string> warnings, ICollection<string> errors)
43         {
44             ErrorUtilities.VerifyThrowArgumentNull(sdkLogger, nameof(sdkLogger));
45             ErrorUtilities.VerifyThrowArgumentNull(warnings, nameof(warnings));
46             ErrorUtilities.VerifyThrowArgumentNull(errors, nameof(errors));
47 
48             _sdkLogger = sdkLogger;
49             _warnings = warnings;
50             _errors = errors;
51         }
52 
Log(LogLevel level, string data)53         public void Log(LogLevel level, string data)
54         {
55             switch (level)
56             {
57                 case LogLevel.Debug:
58                 case LogLevel.Minimal:
59                 case LogLevel.Verbose:
60                 case LogLevel.Information:
61                     // ReSharper disable once RedundantArgumentDefaultValue
62                     _sdkLogger.LogMessage(data, MessageImportance.Low);
63                     break;
64 
65                 case LogLevel.Warning:
66                     _warnings.Add(data);
67                     break;
68 
69                 case LogLevel.Error:
70                     _errors.Add(data);
71                     break;
72             }
73         }
74 
75         public void Log(ILogMessage message) => Log(message.Level, message.Message);
76 
LogAsync(LogLevel level, string data)77         public Task LogAsync(LogLevel level, string data)
78         {
79             Log(level, data);
80 
81             return Task.CompletedTask;
82         }
83 
LogAsync(ILogMessage message)84         public Task LogAsync(ILogMessage message)
85         {
86             Log(message);
87 
88             return Task.CompletedTask;
89         }
90 
LogDebug(string data)91         public void LogDebug(string data) => Log(LogLevel.Debug, data);
92 
LogError(string data)93         public void LogError(string data) => Log(LogLevel.Error, data);
94 
LogInformation(string data)95         public void LogInformation(string data) => Log(LogLevel.Information, data);
96 
LogInformationSummary(string data)97         public void LogInformationSummary(string data) => Log(LogLevel.Information, data);
98 
LogMinimal(string data)99         public void LogMinimal(string data) => Log(LogLevel.Minimal, data);
100 
LogVerbose(string data)101         public void LogVerbose(string data) => Log(LogLevel.Verbose, data);
102 
LogWarning(string data)103         public void LogWarning(string data) => Log(LogLevel.Warning, data);
104     }
105 }
106