Script for automating a large assortment of AME related actions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
7.6 KiB

using System;
using System.Threading;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Ameliorated.ConsoleUtils
{
[AttributeUsage(AttributeTargets.Property)]
internal sealed class OptionalAttribute : Attribute
{
}
public static class ConsoleUtils
{
public class LoadingIndicator : IDisposable
{
public LoadingIndicator() {}
public LoadingIndicator(bool start)
{
if (start)
StartAsync();
}
private CancellationTokenSource cts = new CancellationTokenSource();
Task currentTask = Task.CompletedTask;
public async Task StartAsync()
{
Console.CursorVisible = false;
cts = new CancellationTokenSource();
currentTask = Task.Run(() =>
{
if (cts.IsCancellationRequested)
{
Console.WriteLine("...");
return;
}
Console.Write('.');
while (true)
{
Thread.Sleep(500);
Console.Write('.');
Thread.Sleep(500);
Console.Write('.');
Thread.Sleep(500);
if (cts.IsCancellationRequested)
{
Console.WriteLine();
return;
}
Console.Write("\b \b\b \b");
}
});
await currentTask;
}
public void Stop()
{
cts.Cancel();
currentTask.Wait();
}
public void Dispose()
{
Stop();
this.currentTask = null;
this.cts = null;
}
}
public static bool DisplayErrors { get; set; } = true;
public static void ClearInputBuffer()
{
while (Console.KeyAvailable) Console.ReadKey(true);
}
internal static void WriteError(string text)
{
if (DisplayErrors) Console.WriteLine("ConsoleUtils: " + text);
}
private static ConsoleColor foregroundCache;
private static ConsoleColor backgroundCache;
private static bool? foregroundOnly;
internal static void SetColor([CanBeNull] ConsoleColor? foreground)
{
foregroundCache = Console.ForegroundColor;
if (foreground.HasValue)
Console.ForegroundColor = foreground.Value;
foregroundOnly = true;
}
internal static void SetColor([CanBeNull] ConsoleColor? foreground, [CanBeNull] ConsoleColor? background)
{
foregroundCache = Console.ForegroundColor;
backgroundCache = Console.BackgroundColor;
if (foreground.HasValue)
Console.ForegroundColor = foreground.Value;
if (background.HasValue)
Console.BackgroundColor = background.Value;
foregroundOnly = false;
}
internal static void ResetColor()
{
if (!foregroundOnly.HasValue) throw new MethodAccessException("SetColor must be used before calling ResetColor.");
if (foregroundOnly.Value)
{
Console.ForegroundColor = foregroundCache;
} else
{
Console.ForegroundColor = foregroundCache;
Console.BackgroundColor = backgroundCache;
}
foregroundOnly = null;
}
public static void WriteLine(string text, ConsoleColor? foreground)
{
foreach (var line in text.SplitByLine())
{
ConsoleUtils.SetColor(foreground);
Console.WriteLine(line);
ConsoleUtils.ResetColor();
}
}
public static void WriteLine(string text, ConsoleColor? foreground, ConsoleColor? background)
{
foreach (var line in text.SplitByLine())
{
ConsoleUtils.SetColor(foreground);
Console.WriteLine(line);
ConsoleUtils.ResetColor();
}
}
public static void WriteLine(string text, int offset)
{
foreach (var line in text.SplitByLine())
{
Console.WriteLine(line.Insert(0, new string(' ', offset)));
}
}
public static void WriteLine(string text, int offset, ConsoleColor? foreground)
{
foreach (var line in text.SplitByLine())
{
Console.Write(new string(' ', offset));
ConsoleUtils.SetColor(foreground);
Console.WriteLine(line);
ConsoleUtils.ResetColor();
}
}
public static void WriteLine(string text, int offset, ConsoleColor? foreground, ConsoleColor? background)
{
foreach (var line in text.SplitByLine())
{
Console.Write(new string(' ', offset));
ConsoleUtils.SetColor(foreground, background);
Console.WriteLine(line);
ConsoleUtils.ResetColor();
}
}
public static void Write(string text, ConsoleColor? foreground)
{
foreach (var line in text.SplitByLine())
{
ConsoleUtils.SetColor(foreground);
Console.Write(line);
ConsoleUtils.ResetColor();
}
}
public static void Write(string text, ConsoleColor? foreground, ConsoleColor? background)
{
foreach (var line in text.SplitByLine())
{
ConsoleUtils.SetColor(foreground);
Console.Write(line);
ConsoleUtils.ResetColor();
}
}
public static void Write(string text, int offset)
{
foreach (var line in text.SplitByLine())
{
Console.Write(line.Insert(0, new string(' ', offset)));
}
}
public static void Write(string text, int offset, ConsoleColor? foreground)
{
foreach (var line in text.SplitByLine())
{
Console.Write(new string(' ', offset));
ConsoleUtils.SetColor(foreground);
Console.Write(line);
ConsoleUtils.ResetColor();
}
}
public static void Write(string text, int offset, ConsoleColor? foreground, ConsoleColor? background)
{
foreach (var line in text.SplitByLine())
{
Console.Write(new string(' ', offset));
ConsoleUtils.SetColor(foreground, background);
Console.Write(line);
ConsoleUtils.ResetColor();
}
}
}
}