public async Task <int> Open( FilePath path, IEnumerable <IModListingGetter> loadOrder, CancellationToken cancel) { using var loadOrderFile = _loadOrderProvider.Get(loadOrder); return(await _processRunner.Run( _runProcessStartInfoProvider.GetStart("SettingsHost/Synthesis.Bethesda.SettingsHost.exe", directExe: true, new HostSettings() { PatcherName = _nameProvider.Name, PatcherPath = path, Left = (int)_windowPlacement.Left, Top = (int)_windowPlacement.Top, Height = (int)_windowPlacement.Height, Width = (int)_windowPlacement.Width, LoadOrderFilePath = loadOrderFile.File.Path, DataFolderPath = _dataDirectoryProvider.Path, GameRelease = _gameReleaseContext.Release, }), cancel : cancel).ConfigureAwait(false)); }
public PatcherRunnabilityCliState( ICompilationProvider compilationProvider, IProfileDataFolderVm dataFolder, IProfileLoadOrder loadOrder, IExecuteRunnabilityCheck checkRunnability, ITemporaryLoadOrderProvider temporaryLoadOrderProvider, ILogger logger) { Runnable = Observable.CombineLatest( compilationProvider.State, dataFolder.WhenAnyValue(x => x.Path), loadOrder.LoadOrder.Connect() .QueryWhenChanged() .StartWith(ListExt.Empty <ReadOnlyModListingVM>()), (comp, data, loadOrder) => (comp, data, loadOrder)) .Select(i => { return(Observable.Create <ConfigurationState <RunnerRepoInfo> >(async(observer, cancel) => { if (i.comp.RunnableState.Failed) { observer.OnNext(i.comp); return; } logger.Information("Checking runnability"); // Return early with the values, but mark not complete observer.OnNext(new ConfigurationState <RunnerRepoInfo>(i.comp.Item) { IsHaltingError = false, RunnableState = ErrorResponse.Fail("Checking runnability") }); try { using var tmpLoadOrder = temporaryLoadOrderProvider.Get( i.loadOrder.Select <ReadOnlyModListingVM, IModListingGetter>(lvm => lvm)); var runnability = await checkRunnability.Check( path: i.comp.Item.ProjPath, directExe: false, cancel: cancel, buildMetaPath: i.comp.Item.MetaPath, loadOrderPath: tmpLoadOrder.File).ConfigureAwait(false); if (runnability.Failed) { logger.Information($"Checking runnability failed: {runnability.Reason}"); observer.OnNext(runnability.BubbleFailure <RunnerRepoInfo>()); return; } // Return things again, without error logger.Information("Checking runnability succeeded"); observer.OnNext(i.comp); } catch (Exception ex) { var str = $"Error checking runnability on runner repository: {ex}"; logger.Error(str); observer.OnNext(ErrorResponse.Fail(str).BubbleFailure <RunnerRepoInfo>()); } observer.OnCompleted(); })); }) .Switch() .Replay(1) .RefCount(); }