public async Task HandleAsync(Message message) { await engine.Initialized; var request = message.Content as CompleteRequestContent; if (request == null) { logger.LogError("Expected completion result content, but got {Type} instead.", message.Content.GetType()); return; } this.logger.LogDebug("Ask to complete code at cursor position {CursorPos}:\n{Code}", request.CursorPos, request.Code); shellServer.NotifyBusyStatus(message, ExecutionState.Busy); try { var completion = await engine.Complete(request.Code, request.CursorPos); // If we got a completion back from the engine that was anything // other than null, respond with it here. Note that unlike execute_request, // it's ok to just ignore a complete request that we don't know // how to handle. if (completion != null) { this.shellServer.SendShellMessage( new Message { Content = new CompleteReplyContent { CompleteStatus = completion.Value.Status, Matches = completion.Value.Matches.ToList(), CursorStart = completion.Value.CursorStart ?? request.CursorPos, CursorEnd = completion.Value.CursorEnd ?? request.CursorPos }, Header = new MessageHeader { MessageType = "complete_reply" } } .AsReplyTo(message) ); } return; } catch (TaskCanceledException tce) { this.logger?.LogDebug(tce, "Task cancelled."); return; } catch (Exception e) { this.logger?.LogError(e, "Unable to process CompleteRequest."); return; } finally { shellServer.NotifyBusyStatus(message, ExecutionState.Idle); } }
public override async Task <ExecutionResult> HandleAsync(Message message, ExecutionResult?previousResult, Action onHandled) { this.logger.LogDebug($"Asked to execute code:\n{((ExecuteRequestContent)message.Content).Code}"); if (previousResult != null && previousResult.Value.Status != ExecuteStatus.Ok) { this.logger.LogDebug("Aborting due to previous execution result indicating failure: {PreviousResult}", previousResult.Value); onHandled(); await SendAbortMessage(message); return(ExecutionResult.Aborted); } var executionCount = IncrementExecutionCount(); shellServer.NotifyBusyStatus(message, ExecutionState.Busy); try { var result = await ExecutionTaskForMessage(message, executionCount, onHandled); return(result); } catch (TaskCanceledException tce) { this.logger?.LogDebug(tce, "Task cancelled."); return(new ExecutionResult { Output = null, Status = ExecuteStatus.Abort }); } catch (Exception e) { this.logger?.LogError(e, "Unable to process ExecuteRequest"); return(new ExecutionResult { Output = e, Status = ExecuteStatus.Error }); } finally { shellServer.NotifyBusyStatus(message, ExecutionState.Idle); } }