Example #1
0
        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);
            }
        }