From 1be5b3263961ac993254b0e7efb08b7885a352d8 Mon Sep 17 00:00:00 2001 From: focustense Date: Sun, 3 Oct 2021 11:26:53 -0400 Subject: [PATCH] Show relevant error for invalid command line args. Also fixes the unreported but apparently broken error display for other errors, like invalid games. The originally-caught exceptions were nested in an Autofac exception and have to be unwrapped to restore the original behavior. Fixes #127 --- Focus.Apps.EasyNpc/App.xaml.cs | 57 +++++++++++++------ .../Main/StartupWarningWindow.xaml | 19 +++++++ Focus.Apps.EasyNpc/Main/StartupWarnings.cs | 13 +++++ 3 files changed, 73 insertions(+), 16 deletions(-) diff --git a/Focus.Apps.EasyNpc/App.xaml.cs b/Focus.Apps.EasyNpc/App.xaml.cs index 2d8b742..36373af 100644 --- a/Focus.Apps.EasyNpc/App.xaml.cs +++ b/Focus.Apps.EasyNpc/App.xaml.cs @@ -1,12 +1,16 @@ using Autofac; +using Autofac.Core; using CommandLine; +using CommandLine.Text; using Focus.Apps.EasyNpc.Configuration; using Focus.Apps.EasyNpc.Main; using Focus.Apps.EasyNpc.Reports; using Focus.ModManagers; using Serilog; using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Windows; namespace Focus.Apps.EasyNpc @@ -16,11 +20,21 @@ namespace Focus.Apps.EasyNpc /// public partial class App : Application { + private IDisposable? container; + private void Application_Startup(object sender, StartupEventArgs e) { Console.WriteLine("Application started"); Parser.Default.ParseArguments(e.Args) - .WithParsed(Start); + .WithParsed(Start) + .WithNotParsed(DisplayErrors); + } + + private void DisplayErrors(IEnumerable errors) + { + var sentenceBuilder = SentenceBuilder.Create(); + var errorMessages = errors.Select(e => sentenceBuilder.FormatError(e)); + Warn(StartupWarnings.InvalidCommandLine(errorMessages), true); } private void Start(CommandLineOptions options) @@ -36,46 +50,51 @@ private void Start(CommandLineOptions options) if (isVortex && string.IsNullOrEmpty(options.VortexManifest) && !Warn(StartupWarnings.MissingVortexManifest)) { - Current.Shutdown(); return; } var container = AppContainer.Build(options, startupInfo); + this.container = container; var logger = container.Resolve(); var mainWindow = MainWindow = new MainWindow(logger, container); if (isFirstLaunch && string.IsNullOrEmpty(Settings.Default.DefaultModRootDirectory)) Settings.Default.DefaultModRootDirectory = container.Resolve().ModsDirectory; try { - if (options.PostBuild) + try { - var postBuildReportViewModel = container.Resolve(); - mainWindow.DataContext = postBuildReportViewModel; - _ = postBuildReportViewModel.UpdateReport(); + if (options.PostBuild) + { + var postBuildReportViewModel = container.Resolve(); + mainWindow.DataContext = postBuildReportViewModel; + _ = postBuildReportViewModel.UpdateReport(); + } + else + { + var mainViewModelFactory = container.Resolve(); + var mainViewModel = mainViewModelFactory(isFirstLaunch); + mainWindow.DataContext = mainViewModel; + } } - else + catch (DependencyResolutionException ex) { - var mainViewModelFactory = container.Resolve(); - var mainViewModel = mainViewModelFactory(isFirstLaunch); - mainWindow.DataContext = mainViewModel; + if (ex.InnerException is not null) + throw ex.InnerException; + throw; } mainWindow.Show(); } catch (MissingGameDataException ex) { Warn(StartupWarnings.MissingGameData(ex.GameId, ex.GameName), true); - container.Dispose(); - Current.Shutdown(); } catch (UnsupportedGameException ex) { Warn(StartupWarnings.UnsupportedGame(ex.GameId, ex.GameName), true); - container.Dispose(); - Current.Shutdown(); } } - private static bool Warn(StartupWarning warning, bool isFatal = false) + private bool Warn(StartupWarning warning, bool isFatal = false) { var model = new StartupWarningViewModel { @@ -87,7 +106,13 @@ private static bool Warn(StartupWarning warning, bool isFatal = false) { DataContext = model }; - return warningWindow.ShowDialog() == true; + var ignored = warningWindow.ShowDialog() == true; + if (!ignored) + { + container?.Dispose(); + Current.Shutdown(); + } + return ignored; } } } diff --git a/Focus.Apps.EasyNpc/Main/StartupWarningWindow.xaml b/Focus.Apps.EasyNpc/Main/StartupWarningWindow.xaml index aa70b2f..4e92448 100644 --- a/Focus.Apps.EasyNpc/Main/StartupWarningWindow.xaml +++ b/Focus.Apps.EasyNpc/Main/StartupWarningWindow.xaml @@ -48,6 +48,25 @@