File: Commands\Test\MTP\Terminal\HumanReadableDurationFormatter.cs
Web Access
Project: ..\..\..\src\Cli\dotnet\dotnet.csproj (dotnet)
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System.Globalization;
 
namespace Microsoft.DotNet.Cli.Commands.Test.Terminal;
 
internal static class HumanReadableDurationFormatter
{
    public static void Append(ITerminal terminal, TimeSpan duration, bool wrapInParentheses = true)
    {
        bool hasParentValue = false;
 
        if (wrapInParentheses)
        {
            terminal.Append('(');
        }
 
        if (duration.Days > 0)
        {
            terminal.Append($"{duration.Days}d");
            hasParentValue = true;
        }
 
        if (duration.Hours > 0 || hasParentValue)
        {
            terminal.Append(GetFormattedPart(duration.Hours, hasParentValue, "h"));
            hasParentValue = true;
        }
 
        if (duration.Minutes > 0 || hasParentValue)
        {
            terminal.Append(GetFormattedPart(duration.Minutes, hasParentValue, "m"));
            hasParentValue = true;
        }
 
        if (duration.Seconds > 0 || hasParentValue)
        {
            terminal.Append(GetFormattedPart(duration.Seconds, hasParentValue, "s"));
            hasParentValue = true;
        }
 
        if (duration.Milliseconds >= 0 || hasParentValue)
        {
            terminal.Append(GetFormattedPart(duration.Milliseconds, hasParentValue, "ms", paddingWitdh: 3));
        }
 
        if (wrapInParentheses)
        {
            terminal.Append(')');
        }
    }
 
    private static string GetFormattedPart(int value, bool hasParentValue, string suffix, int paddingWitdh = 2)
        => $"{(hasParentValue ? " " : string.Empty)}{(hasParentValue ? value.ToString(CultureInfo.InvariantCulture).PadLeft(paddingWitdh, '0') : value.ToString(CultureInfo.InvariantCulture))}{suffix}";
 
    public static string Render(TimeSpan? duration, bool wrapInParentheses = true, bool showMilliseconds = false)
    {
        if (duration is null)
        {
            return string.Empty;
        }
 
        bool hasParentValue = false;
 
        var stringBuilder = new StringBuilder();
 
        if (wrapInParentheses)
        {
            stringBuilder.Append('(');
        }
 
        if (duration.Value.Days > 0)
        {
            stringBuilder.Append(CultureInfo.CurrentCulture, $"{duration.Value.Days}d");
            hasParentValue = true;
        }
 
        if (duration.Value.Hours > 0 || hasParentValue)
        {
            stringBuilder.Append(GetFormattedPart(duration.Value.Hours, hasParentValue, "h"));
            hasParentValue = true;
        }
 
        if (duration.Value.Minutes > 0 || hasParentValue)
        {
            stringBuilder.Append(GetFormattedPart(duration.Value.Minutes, hasParentValue, "m"));
            hasParentValue = true;
        }
 
        if (duration.Value.Seconds > 0 || hasParentValue || !showMilliseconds)
        {
            stringBuilder.Append(GetFormattedPart(duration.Value.Seconds, hasParentValue, "s"));
            hasParentValue = true;
        }
 
        if (showMilliseconds)
        {
            if (duration.Value.Milliseconds >= 0 || hasParentValue)
            {
                stringBuilder.Append(GetFormattedPart(duration.Value.Milliseconds, hasParentValue, "ms", paddingWitdh: 3));
            }
        }
 
        if (wrapInParentheses)
        {
            stringBuilder.Append(')');
        }
 
        return stringBuilder.ToString();
    }
}