Skip to content

Commit 61bc139

Browse files
committed
Refactor logging
1 parent 194423a commit 61bc139

File tree

12 files changed

+101
-70
lines changed

12 files changed

+101
-70
lines changed

src/ApiCodeGenerator.Abstraction/ILogger.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ namespace ApiCodeGenerator.Abstraction
66
{
77
public interface ILogger
88
{
9-
void LogError(string? sourceFile, string message, params object[] messageArgs);
9+
void LogError(string? code, string? sourceFile, string message, params object[] messageArgs);
1010

11-
void LogMessage(string message, params object[] messageArgs);
11+
void LogMessage(string? code, string? sourceFile, string message, params object[] messageArgs);
1212

13-
void LogWarning(string? sourceFile, string message, params object[] messageArgs);
13+
void LogWarning(string? code, string? sourceFile, string message, params object[] messageArgs);
1414
}
1515
}

src/ApiCodeGenerator.Core/GenerationTask.cs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44
using System.Diagnostics.CodeAnalysis;
55
using System.IO;
66
using System.Linq;
7-
using System.Reflection;
8-
using System.Text;
97
using System.Threading.Tasks;
108
using ApiCodeGenerator.Abstraction;
119
using ApiCodeGenerator.Core.NswagDocument;
1210
using ApiCodeGenerator.Core.NswagDocument.Converters;
1311
using Newtonsoft.Json;
1412
using Newtonsoft.Json.Linq;
13+
using static ApiCodeGenerator.Core.LogCodes;
1514

1615
namespace ApiCodeGenerator.Core
1716
{
@@ -69,45 +68,45 @@ internal GenerationTask(
6968
/// Генерирует код и сохраняет его в указанный файл.
7069
/// </summary>
7170
/// <param name="nswagFilePath">Путь к файлу настроек генератора.</param>
72-
/// <param name="openApiFilePath">Путь к файлу документа OpenApi.</param>
71+
/// <param name="apiDocumentPath">Путь к файлу документа Api.</param>
7372
/// <param name="outFilePath">Путь к фалу с результатами генерации.</param>
7473
/// <param name="variables">Перечень пар ключ=значение разделенныз запятой.</param>
7574
/// <param name="baseNswagFilePath">Файл базовых настроек.</param>
7675
/// <returns>True если процесс генерации успешно завершен.</returns>
7776
public async Task<bool> ExecuteAsync(string nswagFilePath,
78-
string openApiFilePath,
77+
string apiDocumentPath,
7978
string outFilePath,
8079
string? variables = null,
8180
string? baseNswagFilePath = null)
8281
{
8382
if (!_fileProvider.Exists(nswagFilePath))
8483
{
85-
Log?.LogError(null, "File '{0}' not found.", nswagFilePath);
84+
Log?.LogError(FileNotFound, nswagFilePath, message: "File '{0}' not found.", messageArgs: nswagFilePath);
8685
return false;
8786
}
8887

8988
// System.Diagnostics.Debugger.Launch();
9089
var vars = ParseVariables(variables);
91-
vars["InputJson"] = openApiFilePath;
90+
vars["InputJson"] = apiDocumentPath;
9291
vars["OutFile"] = outFilePath;
9392
var roVariables = new ReadOnlyDictionary<string, string>(vars);
9493

95-
Log?.LogMessage("Values of nswag variables");
96-
Log?.LogMessage(string.Join(Environment.NewLine, vars.Select(_ => $"\t[{_.Key}] = {_.Value}")));
94+
LogMessage("Values of nswag variables");
95+
LogMessage(string.Join(Environment.NewLine, vars.Select(_ => $"\t[{_.Key}] = {_.Value}")));
9796

9897
JObject? baseNswagDocument = LoadBaseNswag(baseNswagFilePath);
9998
var nswagDocument = _documentFactory.LoadNswagDocument(nswagFilePath, roVariables, baseNswagDocument);
10099

101100
var generatorSettings = nswagDocument.CodeGenerators.FirstOrDefault();
102101
if (generatorSettings.Key is null)
103102
{
104-
Log?.LogWarning(nswagFilePath, "Nswag not contains codeGenerator definition. Skip generation.");
103+
Log?.LogWarning(NotDefineGenerator, nswagFilePath, "Nswag not contains codeGenerator definition. Skip generation.");
105104
return true;
106105
}
107106

108107
if (!_extensions.CodeGenerators.TryGetValue(generatorSettings.Key, out var contentGeneratorFactory))
109108
{
110-
Log?.LogError(nswagFilePath, $"Unable find generator {generatorSettings.Key}. Check package references.");
109+
Log?.LogError(GenNotFound, nswagFilePath, $"Unable find generator {generatorSettings.Key}. Check package references.");
111110
return false;
112111
}
113112

@@ -117,38 +116,41 @@ public async Task<bool> ExecuteAsync(string nswagFilePath,
117116
{
118117
if (context.DocumentReader is null)
119118
{
120-
Log?.LogWarning(nswagFilePath, "Source not set. Skip generation.");
119+
Log?.LogWarning(NotSetInput, nswagFilePath, "Source not set. Skip generation.");
121120
return true;
122121
}
123122

124123
try
125124
{
126-
Log?.LogMessage($"Use settings: {generatorSettings.Key}");
125+
LogMessage($"Use settings: {generatorSettings.Key}");
127126
var contentGenerator = await contentGeneratorFactory.Invoke(context);
128127

129-
Log?.LogMessage("Generate content for file '{0}'", outFilePath);
128+
LogMessage("Generate content for file '{0}'", outFilePath);
130129
var code = contentGenerator.Generate();
131130

132131
try
133132
{
134-
Log?.LogMessage("Write file '{0}'", outFilePath);
133+
LogMessage("Write file '{0}'", outFilePath);
135134
await _fileProvider.WriteAllTextAsync(outFilePath, code);
136135
}
137136
catch (Exception ex)
138137
{
139-
Log?.LogError("Unable write file. Error:", ex.Message);
138+
Log?.LogError(WriteFileErr, outFilePath, "Unable write file. Error: {0}", ex.Message);
140139
}
141140
}
142141
catch (InvalidOperationException ex)
143142
{
144-
Log?.LogError(nswagFilePath, ex.Message);
143+
Log?.LogError(GenerationErr, nswagFilePath, ex.Message);
145144
return false;
146145
}
147146

148147
return true;
149148
}
150149

151150
return false;
151+
152+
void LogMessage(string message, params object[] messageArgs)
153+
=> Log?.LogMessage(null, nswagFilePath, message, messageArgs);
152154
}
153155

154156
private async Task<GeneratorContext?> CreateGenerationContext(
@@ -175,7 +177,7 @@ public async Task<bool> ExecuteAsync(string nswagFilePath,
175177

176178
if (result is not null && !string.IsNullOrEmpty(result.Error))
177179
{
178-
Log?.LogError(result.FilePath ?? nswagFilePath, result.Error!);
180+
Log?.LogError(DocumentOpenErr, result.FilePath ?? nswagFilePath, result.Error!);
179181
return null;
180182
}
181183

src/ApiCodeGenerator.Core/LogCodes.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace ApiCodeGenerator.Core;
2+
3+
internal static class LogCodes
4+
{
5+
public const string FileNotFound = "ACG0001";
6+
public const string GenNotFound = "ACG0002";
7+
public const string DocumentOpenErr = "ACG0003";
8+
public const string WriteFileErr = "ACG0004";
9+
public const string GenerationErr = "ACG0005";
10+
11+
public const string NotDefineGenerator = "ACG1001";
12+
public const string NotSetInput = "ACG1002";
13+
public const string PreprocSkiped = "ACG1003";
14+
}

src/ApiCodeGenerator.Core/NswagDocument/PreprocessorHelper.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,26 @@ public static Preprocessors GetPreprocessors(IExtensions? extensions, IDictionar
5151
{
5252
var tuple = CreatePreprocessor(processor, method);
5353
if (tuple is null)
54-
log?.LogWarning(null, "Method '{0}' skiped, because his signature not like Func<T,string,T>.", method.ToString());
54+
{
55+
log?.LogWarning(
56+
LogCodes.PreprocSkiped,
57+
null,
58+
message: "Method '{0}' skiped, because his signature not like Func<T,string,T>.",
59+
messageArgs: [method.ToString()]);
60+
}
5561
else
62+
{
5663
yield return tuple.Value;
64+
}
5765
}
5866
}
5967
else
6068
{
61-
log?.LogWarning(null, "Preprocessor '{0}' skiped, because method 'Process' not found.", name!);
69+
log?.LogWarning(
70+
LogCodes.PreprocSkiped,
71+
null,
72+
message: "Preprocessor '{0}' skiped, because method 'Process' not found.",
73+
messageArgs: [name!]);
6274
}
6375
}
6476

src/ApiCodeGenerator.MSBuild/Console/ConsoleLogAdapter.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ namespace ApiCodeGenerator.MSBuild
99
{
1010
internal class ConsoleLogAdapter : ILogger
1111
{
12-
public void LogError(string? sourceFile, string message, params object[] messageArgs)
12+
public void LogError(string? code, string? sourceFile, string message, params object[] messageArgs)
1313
=> Console.Error.WriteLine($"{sourceFile}: {string.Format(message, messageArgs)}");
1414

15-
public void LogMessage(string message, params object[] messageArgs)
15+
public void LogMessage(string? code, string? sourceFile, string message, params object[] messageArgs)
1616
=> Console.WriteLine($"INFO: {string.Format(message, messageArgs)}");
1717

18-
public void LogWarning(string? sourceFile, string message, params object[] messageArgs)
18+
public void LogWarning(string? code, string? sourceFile, string message, params object[] messageArgs)
1919
=> Console.WriteLine($"WARNING {sourceFile}: {string.Format(message, messageArgs)}");
2020
}
2121
}

src/ApiCodeGenerator.MSBuild/Task/MSBuildLogger.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ public MSBuildLogger(TaskLoggingHelper log)
1212
_log = log;
1313
}
1414

15-
public void LogError(string? sourceFile, string message, params object[] messageArgs)
16-
=> _log.LogError(null, null, null, sourceFile, 0, 0, 0, 0, message, messageArgs);
15+
public void LogError(string? errorCode, string? sourceFile, string message, params object[] messageArgs)
16+
=> _log.LogError(null, errorCode, null, sourceFile, 0, 0, 0, 0, message, messageArgs);
1717

18-
public void LogMessage(string message, params object[] messageArgs)
19-
=> _log.LogMessage(message, messageArgs);
18+
public void LogMessage(string? code, string? sourceFile, string message, params object[] messageArgs)
19+
=> _log.LogMessage(null, code, null, sourceFile, 0, 0, 0, 0, Microsoft.Build.Framework.MessageImportance.Normal, message, messageArgs);
2020

21-
public void LogWarning(string? sourceFile, string message, params object[] messageArgs)
22-
=> _log.LogWarning(null, null, null, sourceFile, 0, 0, 0, 0, message, messageArgs);
21+
public void LogWarning(string? warningCode, string? sourceFile, string message, params object[] messageArgs)
22+
=> _log.LogWarning(null, warningCode, null, sourceFile, 0, 0, 0, 0, message, messageArgs);
2323
}

test/ApiCodeGenerator.AsyncApi.Tests/AsyncApiContentGeneratorTests.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public async Task LoadApiDocument_WithTextPreprocess_Log()
134134
Assert.That(apiDocument?.Components?.Schemas, Does.ContainKey(schemaName));
135135
var sch = apiDocument?.Components?.Schemas[schemaName].ToJson(Newtonsoft.Json.Formatting.None);
136136
Assert.That(sch, Is.EqualTo("{\"$schema\":\"http://json-schema.org/draft-04/schema#\",\"processed\":{}}"));
137-
logger.Verify(l => l.LogWarning(filePath, It.IsAny<string>()));
137+
logger.Verify(l => l.LogWarning(It.IsAny<string>(), filePath, It.IsAny<string>()));
138138
}
139139

140140
[Test]
@@ -181,17 +181,17 @@ private void ValidateDocument(AsyncApiDocument document)
181181
.And.ContainKey(channelPrefix + "action.{streetlightId}.dim"));
182182

183183
Assert.NotNull(document.Components);
184-
Assert.That(document.Components.Messages,
184+
Assert.That(document.Components?.Messages,
185185
Is.Not.Null
186186
.And.ContainKey("lightMeasured")
187187
.And.ContainKey("turnOnOff")
188188
.And.ContainKey("dimLight"));
189189

190-
Assert.That(document.Components.Parameters,
190+
Assert.That(document.Components?.Parameters,
191191
Is.Not.Null
192192
.And.ContainKey("streetlightId"));
193193

194-
Assert.That(document.Components.Schemas,
194+
Assert.That(document.Components?.Schemas,
195195
Is.Not.Null
196196
.And.ContainKey("lightMeasuredPayload")
197197
.And.ContainKey("turnOnOffPayload")
@@ -204,32 +204,32 @@ private void ValidateDocument(AsyncApiDocument document)
204204
.And.ContainKey("mtls-connections"));
205205

206206
// Resolve $ref in channel defintion
207-
var actualChannel = document.Channels[channelPrefix + "event.{streetlightId}.lighting.measured"];
207+
var actualChannel = document.Channels?[channelPrefix + "event.{streetlightId}.lighting.measured"];
208208
Assert.That(actualChannel,
209209
Is.Not.Null
210210
.And.Property("Publish").Not.Null
211211
.And.Property("Subscribe").Null);
212-
Assert.That(actualChannel.Parameters,
212+
Assert.That(actualChannel?.Parameters,
213213
Is.Not.Null
214214
.And.ContainKey("streetlightId"));
215-
Assert.That(actualChannel.Parameters["streetlightId"],
215+
Assert.That(actualChannel?.Parameters["streetlightId"],
216216
Is.Not.Null
217217
.And.Property("ReferencePath").EqualTo("#/components/parameters/streetlightId")
218-
.And.Property("Reference").EqualTo(document.Components.Parameters["streetlightId"]));
219-
Assert.That(actualChannel.Publish?.Message,
218+
.And.Property("Reference").EqualTo(document.Components?.Parameters["streetlightId"]));
219+
Assert.That(actualChannel?.Publish?.Message,
220220
Is.Not.Null
221221
.And.Property("ReferencePath").EqualTo("#/components/messages/lightMeasured")
222-
.And.Property("Reference").EqualTo(document.Components.Messages["lightMeasured"]));
222+
.And.Property("Reference").EqualTo(document.Components?.Messages["lightMeasured"]));
223223

224224
// Resolve $ref in message definition
225-
var actualMessage = document.Components.Messages["turnOnOff"];
225+
var actualMessage = document.Components?.Messages["turnOnOff"];
226226
Assert.That(actualMessage, Is.Not.Null);
227-
Assert.That(actualMessage.Payload,
227+
Assert.That(actualMessage?.Payload,
228228
Is.Not.Null
229-
.And.Property("Reference").EqualTo(document.Components.Schemas["turnOnOffPayload"]));
229+
.And.Property("Reference").EqualTo(document.Components?.Schemas["turnOnOffPayload"]));
230230

231231
// Resolve $ref in schema definition
232-
Assert.That(document.Components.Schemas["turnOnOffPayload"]?.ActualProperties,
232+
Assert.That(document.Components?.Schemas["turnOnOffPayload"]?.ActualProperties,
233233
Is.Not.Null
234234
.And.ContainKey("command"));
235235

@@ -243,24 +243,24 @@ private void ValidateDocument(AsyncApiDocument document)
243243
// Resolve $ref in servers
244244
Assert.That(document.Servers["mtls-connections"],
245245
Is.Not.Null
246-
.And.Property("Reference").EqualTo(document.Components.Servers["mtls-connections"]));
246+
.And.Property("Reference").EqualTo(document.Components?.Servers["mtls-connections"]));
247247

248248
// Resolve $ref in server variables
249249
Assert.Multiple(() =>
250250
{
251-
var variables = document.Components.Servers["mtls-connections"].Variables;
251+
var variables = document.Components?.Servers["mtls-connections"].Variables;
252252
Assert.That(variables,
253253
Is.Not.Null
254254
.And.ContainKey("someRefVariable")
255255
.And.ContainKey("someVariable"));
256256

257257
Assert.That(variables!["someRefVariable"],
258258
Is.Not.Null
259-
.And.Property("Reference").EqualTo(document.Components.ServerVariables["someRefVariable"]));
259+
.And.Property("Reference").EqualTo(document.Components?.ServerVariables["someRefVariable"]));
260260
});
261261

262262
//Read server variables
263-
Assert.That(document.Components.ServerVariables["someRefVariable"],
263+
Assert.That(document.Components?.ServerVariables["someRefVariable"],
264264
new PredicateConstraint<ServerVariable>(a =>
265265
a.Description == "Some ref variable"
266266
&& a.Enum?.FirstOrDefault() == "def"

test/ApiCodeGenerator.AsyncApi.Tests/Infrastructure/FakeTextPreprocessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public string Process(string data, string? fileName)
3737

3838
public string Process(string data, string? fileName, ILogger? logger)
3939
{
40-
logger?.LogWarning(fileName, "test");
40+
logger?.LogWarning(null, fileName, "test");
4141
return Process(data, fileName);
4242
}
4343
}

0 commit comments

Comments
 (0)