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(); } } } }