File: UI\RestartPrompt.cs
Web Access
Project: src\src\sdk\src\Dotnet.Watch\Watch\Microsoft.DotNet.HotReload.Watch.csproj (Microsoft.DotNet.HotReload.Watch)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.Extensions.Logging;

namespace Microsoft.DotNet.Watch;

internal sealed class RestartPrompt(ILogger logger, ConsoleInputReader inputReader, bool? noPrompt)
{
    public bool? AutoRestartPreference { get; private set; } = noPrompt;

    public async ValueTask<bool> WaitForRestartConfirmationAsync(string question, CancellationToken cancellationToken)
    {
        if (AutoRestartPreference.HasValue)
        {
            logger.LogInformation("Restarting");
            return AutoRestartPreference.Value;
        }

        var keyInfo = await inputReader.GetKeyAsync(
            $"{question} Yes (y) / No (n) / Always (a) / Never (v)",
            AcceptKey,
            cancellationToken);

        switch (keyInfo.Key)
        {
            case ConsoleKey.Escape:
            case ConsoleKey.Y:
                return true;

            case ConsoleKey.N:
                return false;

            case ConsoleKey.A:
                AutoRestartPreference = true;
                return true;

            case ConsoleKey.V:
                AutoRestartPreference = false;
                return false;
        }

        throw new InvalidOperationException();

        static bool AcceptKey(ConsoleKeyInfo info)
            => info is { Key: ConsoleKey.Y or ConsoleKey.N or ConsoleKey.A or ConsoleKey.V, Modifiers: ConsoleModifiers.None };
    }
}