| File: AnsiParsingLogConsole.cs | Web Access |
| Project: src\runtime\src\libraries\Microsoft.Extensions.Logging.Console\src\Microsoft.Extensions.Logging.Console.csproj (Microsoft.Extensions.Logging.Console) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.IO; using System.Runtime.Versioning; namespace Microsoft.Extensions.Logging.Console { [UnsupportedOSPlatform("android")] [UnsupportedOSPlatform("browser")] [UnsupportedOSPlatform("ios")] [UnsupportedOSPlatform("tvos")] internal sealed class AnsiParsingLogConsole : IConsole { private readonly TextWriter _textWriter; private readonly AnsiParser _parser; public AnsiParsingLogConsole(bool stdErr = false) { _textWriter = stdErr ? System.Console.Error : System.Console.Out; _parser = new AnsiParser(WriteToConsole); } public void Write(string message) { _parser.Parse(message); } private static bool SetColor(ConsoleColor? background, ConsoleColor? foreground) { var backgroundChanged = SetBackgroundColor(background); return SetForegroundColor(foreground) || backgroundChanged; } private static bool SetBackgroundColor(ConsoleColor? background) { if (background.HasValue) { System.Console.BackgroundColor = background.Value; return true; } return false; } private static bool SetForegroundColor(ConsoleColor? foreground) { if (foreground.HasValue) { System.Console.ForegroundColor = foreground.Value; return true; } return false; } private static void ResetColor() { System.Console.ResetColor(); } private void WriteToConsole(string message, int startIndex, int length, ConsoleColor? background, ConsoleColor? foreground) { ReadOnlySpan<char> span = message.AsSpan(startIndex, length); var colorChanged = SetColor(background, foreground); _textWriter.Write(span); if (colorChanged) { ResetColor(); } } } }