using FileTime.App.Core; using FileTime.ConsoleUI.App; using FileTime.ConsoleUI.App.UI; using FileTime.ConsoleUI.App.UI.Color; using FileTime.Core.Command; using FileTime.Core.Interactions; using FileTime.Core.Models; using FileTime.Core.Providers; using FileTime.Providers.Local; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace FileTime.ConsoleUI { public class Program { static ILogger? _logger; static Thread? _renderThread; public static async Task Main() { var serviceProvider = CreateServiceProvider(); _logger = serviceProvider.GetService>()!; var coloredConsoleRenderer = serviceProvider.GetService()!; var localContentProvider = serviceProvider.GetService()!; var renderSynchronizer = serviceProvider.GetService()!; var currentPath = Environment.CurrentDirectory.Replace(Path.DirectorySeparatorChar, Constants.SeparatorChar); _logger.LogInformation("Current directory: '{0}'", currentPath); var currentPossibleDirectory = await localContentProvider.GetByPath(currentPath); if (currentPossibleDirectory is IContainer container) { serviceProvider.GetService(); coloredConsoleRenderer.Clear(); try { Console.CursorVisible = false; } catch { } var app = serviceProvider.GetService()!; await app.SetContainer(container); renderSynchronizer.NeedsReRender(); _renderThread = new Thread(new ThreadStart(renderSynchronizer.Start)); _renderThread.Start(); while (app.IsRunning) { if (await app.ProcessKey(Console.ReadKey(true))) { renderSynchronizer.NeedsReRender(); } } renderSynchronizer.NeedsReRender(); Console.SetCursorPosition(0, Console.WindowHeight - 1); Console.CursorVisible = true; } else { Console.WriteLine("Current working directory is not a directory??? Possible directory's type is: '" + currentPossibleDirectory?.GetType() + "'"); Thread.Sleep(100); } } private static bool IsAnsiColorSupported() { try { Console.CursorLeft = 0; Console.CursorTop = 0; Console.Write("\u001b[0ma"); return Console.CursorLeft == 1 && Console.CursorTop == 0; } catch { return false; } } private static ServiceProvider CreateServiceProvider() { return DependencyInjection.RegisterDefaultServices() //.AddLogging() .AddLogging((builder) => builder.AddConsole().AddDebug()) .AddSingleton() .AddSingleton() .AddSingleton(new Styles(IsAnsiColorSupported())) .AddSingleton() .AddSingleton() .AddSingleton() .AddTransient() .RegisterCommandHandlers() .BuildServiceProvider(); } } internal static class ProgramExtensions { internal static IServiceCollection RegisterCommandHandlers(this IServiceCollection serviceCollection) { foreach (var commandHandler in Startup.GetCommandHandlers()) { serviceCollection.AddTransient(typeof(ICommandHandler), commandHandler); } return serviceCollection; } } }