Beispiel #1
0
        /// <summary>
        /// Takes in the main line command arguments, and handles PatcherRunSettings CLI inputs.
        /// </summary>
        /// <typeparam name="TMod">Setter mod interface</typeparam>
        /// <typeparam name="TModGetter">Getter only mod interface</typeparam>
        /// <param name="settings">Patcher run settings</param>
        /// <param name="patcher">Patcher func that processes a load order, and returns a mod object to export.</param>
        /// <param name="userPreferences">Any custom user preferences</param>
        public async Task Patch <TMod, TModGetter>(
            RunSynthesisMutagenPatcher settings,
            AsyncPatcherFunction <TMod, TModGetter> patcher,
            UserPreferences?userPreferences = null)
            where TMod : class, IMod, TModGetter
            where TModGetter : class, IModGetter
        {
            try
            {
                System.Console.WriteLine("Prepping state.");
                WarmupAll.Init();
                using var state = Utility.ToState <TMod, TModGetter>(settings, userPreferences ?? new UserPreferences());
                System.Console.WriteLine("Running patch.");
                await patcher(state).ConfigureAwait(false);

                if (!settings.OutputPath.IsNullOrWhitespace())
                {
                    System.Console.WriteLine($"Writing to output: {settings.OutputPath}");
                    state.PatchMod.WriteToBinaryParallel(path: settings.OutputPath, param: GetWriteParams(state.RawLoadOrder.Select(x => x.ModKey)));
                }
            }
            catch (Exception ex)
                when(Environment.GetCommandLineArgs().Length == 0 &&
                     (userPreferences?.ActionsForEmptyArgs?.BlockAutomaticExit ?? false))
                {
                    System.Console.Error.WriteLine(ex);
                    System.Console.Error.WriteLine("Error occurred.  Press enter to exit");
                    System.Console.ReadLine();
                }
        }
Beispiel #2
0
        /// <summary>
        /// Takes in the main line command arguments, and handles PatcherRunSettings CLI inputs.
        /// </summary>
        /// <typeparam name="TMod">Setter mod interface</typeparam>
        /// <typeparam name="TModGetter">Getter only mod interface</typeparam>
        /// <param name="args">Main command line args</param>
        /// <param name="patcher">Patcher func that processes a load order, and returns a mod object to export.</param>
        /// <param name="userPreferences">Any custom user preferences</param>
        /// <returns>Int error code of the operation</returns>
        public async Task <int> Patch <TMod, TModGetter>(
            string[] args,
            AsyncPatcherFunction <TMod, TModGetter> patcher,
            UserPreferences?userPreferences = null)
            where TMod : class, IMod, TModGetter
            where TModGetter : class, IModGetter
        {
            if (args.Length == 0)
            {
                var prefs = userPreferences ?? new UserPreferences();
                if (prefs.ActionsForEmptyArgs != null)
                {
                    try
                    {
                        await Patch(
                            GetDefaultRun(prefs, prefs.ActionsForEmptyArgs),
                            patcher,
                            prefs);
                    }
                    catch (Exception ex)
                    {
                        System.Console.Error.WriteLine(ex);
                        if (prefs.ActionsForEmptyArgs.BlockAutomaticExit)
                        {
                            System.Console.Error.WriteLine("Error occurred.  Press enter to exit");
                            System.Console.ReadLine();
                        }
                        return(-1);
                    }
                    if (prefs.ActionsForEmptyArgs.BlockAutomaticExit)
                    {
                        System.Console.Error.WriteLine("Press enter to exit");
                        System.Console.ReadLine();
                    }
                    return(0);
                }
            }
            var parser = new Parser((s) =>
            {
                s.IgnoreUnknownArguments = true;
            });

            return(await parser.ParseArguments(args, typeof(RunSynthesisMutagenPatcher))
                   .MapResult(
                       async(RunSynthesisMutagenPatcher settings) =>
            {
                try
                {
                    System.Console.WriteLine(settings.ToString());
                    await Patch(
                        settings,
                        patcher,
                        userPreferences);
                }
                catch (Exception ex)
                {
                    System.Console.Error.WriteLine(ex);
                    return -1;
                }
                return 0;
            },
                       async _ =>
            {
                return -1;
            }));
        }