private async Task HandleSubmitCode( SubmitCode submitCode, KernelInvocationContext context) { CancellationTokenSource cancellationSource; lock (_cancellationSourceLock) { cancellationSource = _cancellationSource; } var codeSubmissionReceived = new CodeSubmissionReceived( submitCode.Code, submitCode); context.Publish(codeSubmissionReceived); var code = submitCode.Code; var isComplete = await IsCompleteSubmissionAsync(submitCode.Code); if (isComplete) { context.Publish(new CompleteCodeSubmissionReceived(submitCode)); } else { context.Publish(new IncompleteCodeSubmissionReceived(submitCode)); } if (submitCode.SubmissionType == SubmissionType.Diagnose) { return; } Exception exception = null; using var console = await ConsoleOutput.Capture(); using (console.SubscribeToStandardOutput(std => PublishOutput(std, context, submitCode))) using (console.SubscribeToStandardError(std => PublishError(std, context, submitCode))) { if (!cancellationSource.IsCancellationRequested) { try { if (ScriptState == null) { ScriptState = await CSharpScript.RunAsync( code, ScriptOptions, cancellationToken : cancellationSource.Token) .UntilCancelled(cancellationSource.Token); } else { ScriptState = await ScriptState.ContinueWithAsync( code, ScriptOptions, e => { exception = e; return(true); }, cancellationToken : cancellationSource.Token) .UntilCancelled(cancellationSource.Token); } } catch (CompilationErrorException cpe) { exception = new CodeSubmissionCompilationErrorException(cpe); } catch (Exception e) { exception = e; } } } if (!cancellationSource.IsCancellationRequested) { if (exception != null) { string message = null; if (exception is CodeSubmissionCompilationErrorException compilationError) { message = string.Join(Environment.NewLine, (compilationError.InnerException as CompilationErrorException)?.Diagnostics.Select(d => d.ToString()) ?? Enumerable.Empty <string>()); } context.Publish(new CommandFailed(exception, submitCode, message)); } else { if (ScriptState != null && HasReturnValue) { var formattedValues = FormattedValue.FromObject(ScriptState.ReturnValue); context.Publish( new ReturnValueProduced( ScriptState.ReturnValue, submitCode, formattedValues)); } context.Complete(); } } else { context.Publish(new CommandFailed(null, submitCode, "Command cancelled")); } }
public CodeSubmissionEvaluated(SubmitCode command) : base(command) { }
private async Task HandleSubmitCode( SubmitCode submitCode, KernelInvocationContext context) { var codeSubmissionReceived = new CodeSubmissionReceived( submitCode.Code, submitCode); context.OnNext(codeSubmissionReceived); var code = submitCode.Code; context.OnNext(new CompleteCodeSubmissionReceived(submitCode)); Exception exception = null; using var console = await ConsoleOutput.Capture(); using var _ = console.SubscribeToStandardOutput(std => PublishOutput(std, context, submitCode)); try { if (_scriptState == null) { _scriptState = await CSharpScript.RunAsync( code, ScriptOptions); } else { _scriptState = await _scriptState.ContinueWithAsync( code, ScriptOptions, e => { exception = e; return(true); }); } } catch (Exception e) { exception = e; } if (exception != null) { string message = null; if (exception is CompilationErrorException compilationError) { message = string.Join(Environment.NewLine, compilationError.Diagnostics.Select(d => d.ToString())); } context.OnNext(new CommandFailed(exception, submitCode, message)); context.OnError(exception); } else { if (HasReturnValue) { var formattedValues = FormattedValue.FromObject(_scriptState.ReturnValue); context.OnNext( new ValueProduced( _scriptState.ReturnValue, submitCode, true, formattedValues)); } context.OnNext(new CodeSubmissionEvaluated(submitCode)); context.OnCompleted(); } }
private async Task HandleSubmitCode( SubmitCode submitCode, KernelInvocationContext context) { var codeSubmissionReceived = new CodeSubmissionReceived( submitCode.Code, submitCode); context.OnNext(codeSubmissionReceived); var(shouldExecute, code) = IsBufferACompleteSubmission(submitCode.Code); if (shouldExecute) { context.OnNext(new CompleteCodeSubmissionReceived(submitCode)); Exception exception = null; using var console = await ConsoleOutput.Capture(); using var _ = console.SubscribeToStandardOutput(std => PublishOutput(std, context, submitCode)); try { if (_scriptState == null) { _scriptState = await CSharpScript.RunAsync( code, ScriptOptions); } else { _scriptState = await _scriptState.ContinueWithAsync( code, ScriptOptions, e => { exception = e; return(true); }); } } catch (Exception e) { exception = e; } if (exception != null) { var message = string.Join("\n", (_scriptState?.Script?.GetDiagnostics() ?? Enumerable.Empty <Diagnostic>()).Select(d => d.GetMessage())); context.OnNext(new CodeSubmissionEvaluationFailed(exception, message, submitCode)); context.OnError(exception); } else { if (HasReturnValue) { var returnValueType = _scriptState.ReturnValue?.GetType(); var mimeType = MimeTypeFor(returnValueType); var formatted = _scriptState.ReturnValue.ToDisplayString(mimeType); var formattedValues = new List <FormattedValue> { new FormattedValue(mimeType, formatted) }; context.OnNext( new ValueProduced( _scriptState.ReturnValue, submitCode, true, formattedValues)); } context.OnNext(new CodeSubmissionEvaluated(submitCode)); context.OnCompleted(); } } else { context.OnNext(new IncompleteCodeSubmissionReceived(submitCode)); context.OnNext(new CodeSubmissionEvaluated(submitCode)); context.OnCompleted(); } }
public CompleteCodeSubmissionReceived(SubmitCode submitCode) : base(submitCode) { }
public async Task SendAsync(SubmitCode submitCode, CancellationToken cancellationToken) { _channel.OnNext(new CodeSubmissionReceived(submitCode.Id, submitCode.Value)); var(shouldExecute, code) = ComputeFullSubmission(submitCode.Value); if (shouldExecute) { _channel.OnNext(new CompleteCodeSubmissionReceived(submitCode.Id)); Exception exception = null; try { if (_scriptState == null) { _scriptState = await CSharpScript.RunAsync( code, ScriptOptions, cancellationToken : cancellationToken); } else { _scriptState = await _scriptState.ContinueWithAsync( code, ScriptOptions, e => { exception = e; return(true); }, cancellationToken); } } catch (Exception e) { exception = e; } var hasReturnValue = _scriptState != null && (bool)_hasReturnValueMethod.Invoke(_scriptState.Script, null); if (hasReturnValue) { _channel.OnNext(new ValueProduced(submitCode.Id, _scriptState.ReturnValue)); } if (exception != null) { var diagnostics = _scriptState?.Script?.GetDiagnostics() ?? Enumerable.Empty <Diagnostic>(); if (diagnostics.Any()) { var message = string.Join("\n", diagnostics.Select(d => d.GetMessage())); _channel.OnNext(new CodeSubmissionEvaluationFailed(submitCode.Id, exception, message)); } else { _channel.OnNext(new CodeSubmissionEvaluationFailed(submitCode.Id, exception)); } } else { _channel.OnNext(new CodeSubmissionEvaluated(submitCode.Id)); } } else { _channel.OnNext(new IncompleteCodeSubmissionReceived(submitCode.Id)); } }
public CodeSubmissionReceived(string value, SubmitCode submitCode) : base(submitCode) { Value = value ?? throw new ArgumentNullException(nameof(value)); }
private async Task HandleSubmitCode( SubmitCode codeSubmission, KernelInvocationContext context) { var codeSubmissionReceived = new CodeSubmissionReceived( codeSubmission.Code, codeSubmission); context.OnNext(codeSubmissionReceived); var(shouldExecute, code) = IsBufferACompleteSubmission(codeSubmission.Code); if (shouldExecute) { context.OnNext(new CompleteCodeSubmissionReceived(codeSubmission)); Exception exception = null; try { if (_scriptState == null) { _scriptState = await CSharpScript.RunAsync( code, ScriptOptions); } else { _scriptState = await _scriptState.ContinueWithAsync( code, ScriptOptions, e => { exception = e; return(true); }); } } catch (Exception e) { exception = e; } if (exception != null) { var message = string.Join("\n", (_scriptState?.Script?.GetDiagnostics() ?? Enumerable.Empty <Diagnostic>()).Select(d => d.GetMessage())); context.OnNext(new CodeSubmissionEvaluationFailed(exception, message, codeSubmission)); context.OnError(exception); } else { if (HasReturnValue) { context.OnNext(new ValueProduced(_scriptState.ReturnValue, codeSubmission)); } context.OnNext(new CodeSubmissionEvaluated(codeSubmission)); context.OnCompleted(); } } else { context.OnNext(new IncompleteCodeSubmissionReceived(codeSubmission)); context.OnCompleted(); } }