| File: Logging\TerminalLogger\TerminalNodeStatus.cs | Web Access |
| Project: src\msbuild\src\Build\Microsoft.Build.csproj (Microsoft.Build) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #if DEBUG using System; #endif using Microsoft.Build.Framework.Logging; namespace Microsoft.Build.Logging; /// <summary> /// Encapsulates the per-node data shown in live node output. /// </summary> internal class TerminalNodeStatus { public string Project { get; } public string? TargetFramework { get; } public string? RuntimeIdentifier { get; } public TerminalColor TargetPrefixColor { get; } = TerminalColor.Default; public string? TargetPrefix { get; } public string Target { get; } public StopwatchAbstraction Stopwatch { get; } /// <summary> /// Status of a node that is currently doing work. /// </summary> /// <param name="project">The project that is written on left side.</param> /// <param name="targetFramework">Target framework that is colorized and written on left side after project.</param> /// <param name="runtimeIdentifier">Runtime identifier that is colorized and written on left side after target framework.</param> /// <param name="target">The currently running work, usually the currently running target. Written on right.</param> /// <param name="stopwatch">Duration of the current step. Written on right after target.</param> public TerminalNodeStatus(string project, string? targetFramework, string? runtimeIdentifier, string target, StopwatchAbstraction stopwatch) { #if DEBUG if (target.Contains("\x1B")) { throw new ArgumentException("Target should not contain any escape codes, if you want to colorize target use the other constructor."); } #endif Project = project; TargetFramework = targetFramework; RuntimeIdentifier = runtimeIdentifier; Target = target; Stopwatch = stopwatch; } /// <summary> /// Status of a node that is currently doing work. /// </summary> /// <param name="project">The project that is written on left side.</param> /// <param name="targetFramework">Target framework that is colorized and written on left side after project.</param> /// <param name="runtimeIdentifier">Runtime identifier that is colorized and written on left side after target framework.</param> /// <param name="targetPrefixColor">Color for the status of the currently running work written on right.</param> /// <param name="targetPrefix">Colorized status for the currently running work, written on right, before target, and separated by 1 space from it.</param> /// <param name="target">The currently running work, usually the currently runnig target. Written on right.</param> /// <param name="stopwatch">Duration of the current step. Written on right after target.</param> public TerminalNodeStatus(string project, string? targetFramework, string? runtimeIdentifier, TerminalColor targetPrefixColor, string targetPrefix, string target, StopwatchAbstraction stopwatch) : this(project, targetFramework, runtimeIdentifier, target, stopwatch) { TargetPrefixColor = targetPrefixColor; TargetPrefix = targetPrefix; } /// <summary> /// Equality is based on the project, target framework, and target, but NOT the elapsed time. /// </summary> public virtual bool Equals(TerminalNodeStatus? other) => other is not null && Project == other.Project && TargetFramework == other.TargetFramework && RuntimeIdentifier == other.RuntimeIdentifier && Target == other.Target && TargetPrefixColor == other.TargetPrefixColor && TargetPrefix == other.TargetPrefix; public override string ToString() => (TargetFramework, RuntimeIdentifier) switch { (null, null) => $"{TerminalLogger.Indentation}{Project} {Target} ({Stopwatch.ElapsedSeconds:F1}s)", (null, _) => $"{TerminalLogger.Indentation}{Project} {AnsiCodes.Colorize(RuntimeIdentifier, TerminalLogger.RuntimeIdentifierColor)} {Target} ({Stopwatch.ElapsedSeconds:F1}s)", (_, null) => $"{TerminalLogger.Indentation}{Project} {AnsiCodes.Colorize(TargetFramework, TerminalLogger.TargetFrameworkColor)} {Target} ({Stopwatch.ElapsedSeconds:F1}s)", _ => $"{TerminalLogger.Indentation}{Project} {AnsiCodes.Colorize(TargetFramework, TerminalLogger.TargetFrameworkColor)} {AnsiCodes.Colorize(RuntimeIdentifier, TerminalLogger.RuntimeIdentifierColor)} {Target} ({Stopwatch.ElapsedSeconds:F1}s)" }; public override int GetHashCode() { throw new System.NotImplementedException(); } }