tool/TeamCity.Docker/ConsoleLogger.cs (81 lines of code) (raw):
// ReSharper disable ClassNeverInstantiated.Global
namespace TeamCity.Docker
{
using System;
using System.Linq;
using IoC;
internal class ConsoleLogger : ILogger, IDisposable
{
[NotNull] private readonly IOptions _options;
private readonly object _lockObject = new object();
private int _blockCount;
public ConsoleLogger(
[NotNull] IOptions options)
{
_options = options ?? throw new ArgumentNullException(nameof(options));
}
public void Log(string text, Result result = Result.Success)
{
if (text == null)
{
throw new ArgumentNullException(nameof(text));
}
lock (_lockObject)
{
var foregroundColor = Console.ForegroundColor;
try
{
switch (result)
{
case Result.Error:
Console.ForegroundColor = ConsoleColor.Red;
break;
case Result.Warning:
Console.ForegroundColor = ConsoleColor.Yellow;
break;
}
var prefix = new string(Enumerable.Repeat(' ', _blockCount << 1).ToArray());
if (result == Result.Error)
{
Console.Error.WriteLine(prefix + text);
}
else
{
Console.WriteLine(prefix + text);
}
}
finally
{
Console.ForegroundColor = foregroundColor;
}
}
}
public void Details(string text, Result result = Result.Success)
{
if (_options.VerboseMode)
{
Log(text, result);
}
}
public IDisposable CreateBlock(string blockName)
{
if (blockName == null)
{
throw new ArgumentNullException(nameof(blockName));
}
lock (_lockObject)
{
Log(blockName);
_blockCount++;
return this;
}
}
public void Dispose()
{
lock (_lockObject)
{
_blockCount--;
}
}
}
}