Exemplo n.º 1
0
        public GitPatcherState(
            IDriverRepositoryPreparationFollower driverRepositoryPreparation,
            IRunnerRepositoryPreparation runnerRepositoryState,
            IRunnableStateProvider runnableStateProvider,
            IPatcherRunnabilityCliState runnabilityCliState,
            IInstalledSdkFollower dotNetInstalled,
            IEnvironmentErrorsVm envErrors,
            IMissingMods missingMods,
            ILogger logger)
        {
            State = Observable.CombineLatest(
                driverRepositoryPreparation.DriverInfo
                .Select(x => x.ToUnit()),
                runnerRepositoryState.State,
                runnableStateProvider.WhenAnyValue(x => x.State)
                .Select(x => x.ToUnit()),
                runnabilityCliState.Runnable,
                dotNetInstalled.DotNetSdkInstalled
                .Select(x => (x, true))
                .StartWith((new DotNetVersion(string.Empty, false), false)),
                envErrors.WhenAnyFallback(x => x.ActiveError !.ErrorString),
                missingMods.Missing
                .QueryWhenChanged()
                .Throttle(TimeSpan.FromMilliseconds(200), RxApp.MainThreadScheduler)
                .StartWith(ListExt.Empty <ModKey>()),
                (driver, runner, checkout, runnability, dotnet, envError, reqModsMissing) =>
            {
                if (driver.IsHaltingError)
                {
                    return(driver);
                }
                if (runner.IsHaltingError)
                {
                    return(runner);
                }
                if (!dotnet.Item2)
                {
                    return(new ConfigurationState(ErrorResponse.Fail("Determining DotNet SDK installed"))
                    {
                        IsHaltingError = false
                    });
                }

                if (!dotnet.Item1.Acceptable)
                {
                    return(new ConfigurationState(ErrorResponse.Fail("No DotNet SDK installed")));
                }
                if (envError != null)
                {
                    return(new ConfigurationState(ErrorResponse.Fail(envError)));
                }

                if (reqModsMissing.Count > 0)
                {
                    return(new ConfigurationState(ErrorResponse.Fail(
                                                      $"Required mods missing from load order:{Environment.NewLine}{string.Join(Environment.NewLine, reqModsMissing)}")));
                }

                if (runnability.RunnableState.Failed)
                {
                    return(runnability.BubbleError());
                }

                if (checkout.RunnableState.Failed)
                {
                    return(checkout.BubbleError());
                }

                logger.Information("State returned success!");
                return(ConfigurationState.Success);
            })
                    .Replay(1)
                    .RefCount();
        }
Exemplo n.º 2
0
        public GitStatusDisplay(
            IRunnableStateProvider runnableStateProvider,
            ICompilationProvider compilationProvider,
            IPatcherRunnabilityCliState runnabilityCliState,
            IDriverRepositoryPreparationFollower driverRepositoryPreparation)
        {
            StatusDisplay = Observable.CombineLatest(
                driverRepositoryPreparation.DriverInfo,
                runnableStateProvider.WhenAnyValue(x => x.State),
                compilationProvider.State,
                runnabilityCliState.Runnable,
                (driver, runnable, comp, runnability) =>
            {
                if (driver.RunnableState.Failed)
                {
                    if (driver.IsHaltingError)
                    {
                        return(new StatusRecord(
                                   Text: "Blocking Error",
                                   Processing: false,
                                   Blocking: true,
                                   Command: null));
                    }

                    return(new StatusRecord(
                               Text: "Analyzing repository",
                               Processing: true,
                               Blocking: false,
                               Command: null));
                }

                if (runnable.RunnableState.Failed)
                {
                    if (runnable.IsHaltingError)
                    {
                        return(new StatusRecord(
                                   Text: "Blocking Error",
                                   Processing: false,
                                   Blocking: true,
                                   Command: null));
                    }

                    return(new StatusRecord(
                               Text: "Checking out desired state",
                               Processing: true,
                               Blocking: false,
                               Command: null));
                }

                if (comp.RunnableState.Failed)
                {
                    if (comp.IsHaltingError)
                    {
                        return(new StatusRecord(
                                   Text: "Blocking Error",
                                   Processing: false,
                                   Blocking: true,
                                   Command: null));
                    }

                    return(new StatusRecord(
                               Text: "Compiling",
                               Processing: true,
                               Blocking: false,
                               Command: null));
                }

                if (runnability.RunnableState.Failed)
                {
                    if (runnability.IsHaltingError)
                    {
                        return(new StatusRecord(
                                   Text: "Blocking Error",
                                   Processing: false,
                                   Blocking: true,
                                   Command: null));
                    }

                    return(new StatusRecord(
                               Text: "Checking runnability",
                               Processing: true,
                               Blocking: false,
                               Command: null));
                }

                return(new StatusRecord(
                           Text: "Ready",
                           Processing: false,
                           Blocking: false,
                           Command: null));
            })
                            .Replay(1)
                            .RefCount();
        }