public IDisposable Subscribe(IPSObserver <T> observer) { return(_action.Invoke(observer)); }
public IDisposable Subscribe(IPSObserver <TOutput> observer) { lock (_sync) { foreach (var item in _outputCache) { switch (item.Stream) { case PowerShellStreamType.Output: observer.OnOutput(item.Output); break; case PowerShellStreamType.Error: observer.OnError(item.Error !); break; case PowerShellStreamType.Debug: observer.OnDebug(item.Debug !.Message); break; case PowerShellStreamType.Warning: observer.OnWarning(item.Warning !.Message); break; case PowerShellStreamType.Verbose: observer.OnVerbose(item.Verbose !.Message); break; case PowerShellStreamType.Progress: observer.OnProgress(item.Progress !); break; case PowerShellStreamType.Information: observer.OnInformation(item.Information !); break; } } if (_exception != null) { var terminal = _powerShell.Streams.Error.Where(e => e.Exception == _exception).FirstOrDefault() ?? new ErrorRecord(_exception, "PowerShellError", ErrorCategory.NotSpecified, _powerShell); observer.OnFailed(terminal); return(ActionRegistration.None); } if (_isCompleted) { observer.OnCompleted(); return(ActionRegistration.None); } _psObservers.Add(observer); return(new ActionRegistration(() => { lock (_sync) { if (_psObservers.Contains(observer)) { _psObservers.Remove(observer); } } })); } }
IDisposable IPSObservable <PSObject> .Subscribe(IPSObserver <PSObject> observer) { lock (_observationSync) { foreach (var item in _output) { switch (item.Stream) { case PowerShellStreamType.Output: observer.OnOutput(item.Output !); break; case PowerShellStreamType.Error: observer.OnError(item.Error !); break; case PowerShellStreamType.Warning: observer.OnWarning(item.Warning !.Message); break; case PowerShellStreamType.Verbose: observer.OnVerbose(item.Verbose !.Message); break; case PowerShellStreamType.Debug: observer.OnDebug(item.Debug !.Message); break; case PowerShellStreamType.Progress: observer.OnProgress(item.Progress !); break; case PowerShellStreamType.Information: observer.OnInformation(item.Information !); break; } } if (IsFinished) { if (JobStateInfo.State == JobState.Stopped) { observer.OnFailed(new ErrorRecord(new OperationCanceledException(), "JobStopped", ErrorCategory.OperationStopped, this)); } if (JobStateInfo.State == JobState.Failed) { _output.TryPeek(out var r); observer.OnFailed(r.Error ?? new ErrorRecord(new JobFailedException(), "JobFailed", ErrorCategory.NotSpecified, this)); } if (JobStateInfo.State == JobState.Completed) { observer.OnCompleted(); } return(ActionRegistration.None); } else { _psObservers.Add(observer); return(new ActionRegistration(() => { lock (_observationSync) { if (_psObservers.Contains(observer)) { _psObservers.Remove(observer); } } })); } } }