public async Task <ExecutionResult> ExecuteCodeAsync(string text) { var start = 0; var end = text.IndexOf('\n'); if (end == -1) { return(ExecutionResult.Success); } try { using (Session.DisableMutatedOnReadConsole()) { while (end != -1) { var line = text.Substring(start, end - start + 1); start = end + 1; end = text.IndexOf('\n', start); using (var request = await Session.BeginInteractionAsync()) { using (_evaluatorRequest.Increment()) { if (line.Length >= request.MaxLength) { CurrentWindow.WriteErrorLine(string.Format(Resources.InputIsTooLong, request.MaxLength)); return(ExecutionResult.Failure); } await request.RespondAsync(line); } } } } return(ExecutionResult.Success); } catch (RHostDisconnectedException rhdex) { WriteError(rhdex.Message); return(ExecutionResult.Success); } catch (OperationCanceledException) { // Cancellation reason was already reported via RSession.Error and printed out; // Return success cause connection lost doesn't mean that RHost died return(ExecutionResult.Success); } catch (Exception ex) { await _coreShell.ShowErrorMessageAsync(ex.ToString()); return(ExecutionResult.Failure); } finally { History.AddToHistory(text); } }
public async Task <ExecutionResult> ExecuteCodeAsync(string text) { var start = 0; var end = text.IndexOf('\n'); if (end == -1) { return(ExecutionResult.Success); } try { Session.BeforeRequest -= SessionOnBeforeRequest; using (Session.DisableMutatedOnReadConsole()) { while (end != -1) { var line = text.Substring(start, end - start + 1); start = end + 1; end = text.IndexOf('\n', start); using (var request = await Session.BeginInteractionAsync()) { if (line.Length >= request.MaxLength) { CurrentWindow.WriteErrorLine(string.Format(Resources.InputIsTooLong, request.MaxLength)); return(ExecutionResult.Failure); } await request.RespondAsync(line); } } } return(ExecutionResult.Success); } catch (RException) { // It was already reported via RSession.Error and printed out; just return failure. return(ExecutionResult.Failure); } catch (OperationCanceledException) { // Cancellation reason was already reported via RSession.Error and printed out; just return failure. return(ExecutionResult.Failure); } catch (Exception ex) { await _coreShell.DispatchOnMainThreadAsync(() => _coreShell.ShowErrorMessage(ex.ToString())); return(ExecutionResult.Failure); } finally { Session.BeforeRequest += SessionOnBeforeRequest; History.AddToHistory(text); } }