static async Task Main(string[] args) { if (args.Length > 0) { Settings = Settings.CreateOverride(args); } if (Settings.MigrateOldLibrarianData.Length > 0) { Migrate(); return; } if (Settings.Log) { Logger.SetLogger(new Logger("log.txt")); } AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) => Logger.Instance.Log(eventArgs.ExceptionObject.ToString() ?? "Unknown Exception", Logger.Level.Error); State = new State(Settings); using UiHub uiHub = UiHub.Register(80, 20, true); uiHub.Title = $"Librarian v{Version}"; uiHub.MainLoopInterval = Settings.UiInputInterval; uiHub.ViewUpdateReduction = Settings.UiRenderReduction; InitView initView = new InitView(uiHub.AddView("Init")); MainView mainView = new MainView(uiHub.AddView("Main")); DownloadView downloadView = new DownloadView(uiHub.AddView("Download")); ScanView scanView = new ScanView(uiHub.AddView("Scan")); State.PropertyChanged += (s, e) => { switch (e.PropertyName) { case nameof(State.Current): switch (State.Current) { case State.View.Init: uiHub.SwitchView(initView.Name); break; case State.View.Main: uiHub.SwitchView(mainView.Name); break; case State.View.Download: uiHub.SwitchView(downloadView.Name); break; case State.View.Scan: uiHub.SwitchView(scanView.Name); break; } break; case nameof(State.InitCurrentPath): initView.UpdateView(State.InitCurrentPath); break; default: mainView.UpdateView(State); break; } }; State.DownloadState.PropertyChanged += (s, e) => downloadView.UpdateView(State.DownloadState); State.ScanState.PropertyChanged += (s, e) => scanView.UpdateView(State.ScanState); downloadView.UpdateView(State.DownloadState); scanView.UpdateView(State.ScanState); CancellationTokenSource tokenSource = new CancellationTokenSource(); Logger.Instance.Log($"Starting Librarian v{Version}"); Task run = Task.Run(() => Run(tokenSource.Token), tokenSource.Token); uiHub.Run(); tokenSource.Cancel(); await run; Logger.Instance.Log("Stopping"); }