| /*--------------------------------------------------------- |
| * Copyright (C) Microsoft Corporation. All rights reserved. |
| * Licensed under the MIT License. See License.txt in the project root for license information. |
| *--------------------------------------------------------*/ |
| |
| import { execFile } from 'child_process'; |
| import * as path from 'path'; |
| import vscode = require('vscode'); |
| import { promptForMissingTool } from './goInstallTools'; |
| import { outputChannel } from './goStatus'; |
| import { getBinPath, getGoConfig } from './util'; |
| |
| const TOOL_CMD_NAME = 'goplay'; |
| |
| export const playgroundCommand = () => { |
| const editor = vscode.window.activeTextEditor; |
| if (!editor) { |
| vscode.window.showInformationMessage('No editor is active.'); |
| return; |
| } |
| |
| const binaryLocation = getBinPath(TOOL_CMD_NAME); |
| if (!path.isAbsolute(binaryLocation)) { |
| return promptForMissingTool(TOOL_CMD_NAME); |
| } |
| |
| outputChannel.clear(); |
| outputChannel.show(); |
| outputChannel.appendLine('Upload to the Go Playground in progress...\n'); |
| |
| const selection = editor.selection; |
| const code = selection.isEmpty ? editor.document.getText() : editor.document.getText(selection); |
| goPlay(code, getGoConfig(editor.document.uri).get('playground')).then( |
| (result) => { |
| outputChannel.append(result); |
| }, |
| (e: string) => { |
| if (e) { |
| outputChannel.append(e); |
| } |
| } |
| ); |
| }; |
| |
| export function goPlay(code: string, goConfig: vscode.WorkspaceConfiguration): Thenable<string> { |
| const cliArgs = Object.keys(goConfig).map((key) => `-${key}=${goConfig[key]}`); |
| const binaryLocation = getBinPath(TOOL_CMD_NAME); |
| |
| return new Promise<string>((resolve, reject) => { |
| const p = execFile(binaryLocation, [...cliArgs, '-'], (err, stdout, stderr) => { |
| if (err && (<any>err).code === 'ENOENT') { |
| promptForMissingTool(TOOL_CMD_NAME); |
| return reject(); |
| } |
| if (err) { |
| return reject(`Upload to the Go Playground failed.\n${stdout || stderr || err.message}`); |
| } |
| return resolve( |
| `Output from the Go Playground: |
| ${stdout || stderr} |
| Finished running tool: ${binaryLocation} ${cliArgs.join(' ')} -\n` |
| ); |
| }); |
| if (p.pid) { |
| p.stdin.end(code); |
| } |
| }); |
| } |