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(); }
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(); }