diff --git a/src/app.js b/src/app.js index ed24d0ef2b..a4c3bfc171 100644 --- a/src/app.js +++ b/src/app.js @@ -41,6 +41,7 @@ var ContextualListener = require('./app/editor/contextualListener') var ContextView = require('./app/editor/contextView') var BasicReadOnlyExplorer = require('./app/files/basicReadOnlyExplorer') var toolTip = require('./app/ui/tooltip') +var CommandInterpreter = require('./lib/cmdInterpreter') var styleGuide = remixLib.ui.themeChooser var styles = styleGuide.chooser() @@ -354,6 +355,71 @@ Please make a backup of your contracts and start using http://remix.ethereum.org }) txlistener.startListening() + + // ----------------- Command Interpreter ----------------- + /* + this module basically listen on user input (from terminal && editor) + and interpret them as commands + */ + var cmdInterpreter = new CommandInterpreter() + cmdInterpreter.event.register('debug', (hash, cb) => { + startdebugging(hash) + if (cb) cb() + }) + cmdInterpreter.event.register('loadgist', (id, cb) => { + loadFromGist({gist: id}) + if (cb) cb() + }) + cmdInterpreter.event.register('loadurl', (url, cb) => { + importExternal(url, (err, content) => { + if (err) { + toolTip(`Unable to load ${url} from swarm: ${err}`) + if (cb) cb(err) + } else { + try { + content = JSON.parse(content) + async.eachOfSeries(content.sources, (value, file, callbackSource) => { + var url = value.urls[0] // @TODO retrieve all other contents ? + importExternal(url, (error, content) => { + if (error) { + toolTip(`Cannot retrieve the content of ${url}: ${error}`) + } + callbackSource() + }) + }, (error) => { + if (cb) cb(error) + }) + } catch (e) {} + if (cb) cb() + } + }) + }) + cmdInterpreter.event.register('setproviderurl', (url, cb) => { + executionContext.setProviderFromEndpoint(url, 'web3', (error) => { + if (error) toolTip(error) + if (cb) cb() + }) + }) + cmdInterpreter.event.register('batch', (url, cb) => { + var content = editor.get(editor.current()) + if (!content) { + toolTip('no content to execute') + if (cb) cb() + return + } + var split = content.split('\n') + async.eachSeries(split, (value, cb) => { + if (!cmdInterpreter.interpret(value, (error) => { + error ? cb(`Cannot run ${value}. stopping`) : cb() + })) { + cb(`Cannot interpret ${value}. stopping`) + } + }, (error) => { + if (error) toolTip(error) + if (cb) cb() + }) + }) + // ----------------- editor ---------------------------- this._components.editor = new Editor({}) // @TODO: put into editorpanel var editor = self._components.editor // shortcut for the editor @@ -439,6 +505,7 @@ Please make a backup of your contracts and start using http://remix.ethereum.org // ----------------- editor panel ---------------------- this._components.editorpanel = new EditorPanel({ api: { + cmdInterpreter: cmdInterpreter, editor: self._components.editor, config: self._api.config, txListener: txlistener, @@ -506,23 +573,26 @@ Please make a backup of your contracts and start using http://remix.ethereum.org } // ------------------ gist load ---------------- - - var loadingFromGist = gistHandler.handleLoad(queryParams.get(), function (gistId) { - $.ajax({ - url: 'https://api.github.com/gists/' + gistId, - jsonp: 'callback', - dataType: 'jsonp', - success: function (response) { - if (response.data) { - if (!response.data.files) { - modalDialogCustom.alert('Gist load error: ' + response.data.message) - return + function loadFromGist (gistId) { + return gistHandler.handleLoad(gistId, function (gistId) { + $.ajax({ + url: 'https://api.github.com/gists/' + gistId, + jsonp: 'callback', + dataType: 'jsonp', + success: function (response) { + if (response.data) { + if (!response.data.files) { + modalDialogCustom.alert('Gist load error: ' + response.data.message) + return + } + loadFiles(response.data.files, 'gist') } - loadFiles(response.data.files, 'gist') } - } + }) }) - }) + } + + var loadingFromGist = loadFromGist(queryParams.get()) // insert ballot contract if there are no files available if (!loadingFromGist) { diff --git a/src/app/panels/editor-panel.js b/src/app/panels/editor-panel.js index 9c7cb19ab1..ac93a5c0ab 100644 --- a/src/app/panels/editor-panel.js +++ b/src/app/panels/editor-panel.js @@ -27,6 +27,7 @@ class EditorPanel { editor: opts.api.editor, // @TODO: instantiate in eventpanel instead of passing via `opts` terminal: new Terminal({ api: { + cmdInterpreter: self._api.cmdInterpreter, getPosition (event) { var limitUp = 36 var limitDown = 20 diff --git a/src/app/panels/terminal.js b/src/app/panels/terminal.js index 0095b96704..304dc558a8 100644 --- a/src/app/panels/terminal.js +++ b/src/app/panels/terminal.js @@ -72,6 +72,7 @@ class Terminal { self.registerCommand('script', function execute (args, scopedCommands, append) { var script = String(args[0]) scopedCommands.log(`> ${script}`) + if (self._api.cmdInterpreter && self._api.cmdInterpreter.interpret(script)) return self._shell(script, scopedCommands, function (error, output) { if (error) scopedCommands.error(error) else scopedCommands.log(output) diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index 28f73c5c40..5fff59d730 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -85,6 +85,9 @@ function runTab (container, appAPI, appEvents) { }, setFinalContext) }) selectExEnv.value = executionContext.getProvider() + executionContext.event.register('contextChanged', (context, silent) => { + setFinalContext() + }) fillAccountsList(appAPI, el) setInterval(() => { updateAccountBalances(container, appAPI) diff --git a/src/lib/cmdInterpreter.js b/src/lib/cmdInterpreter.js new file mode 100644 index 0000000000..c20baf07ac --- /dev/null +++ b/src/lib/cmdInterpreter.js @@ -0,0 +1,24 @@ +'use strict' +var remixLib = require('remix-lib') +var EventManager = remixLib.EventManager + +class CmdInterpreter { + constructor () { + this.event = new EventManager() + } + interpret (cmd) { + if (!cmd) return false + var accept = commandsRegEx.exec(cmd) + if (accept) { + var param = accept[2] + if (param) param = param.trim() + this.event.trigger(accept[1], [param]) + return accept[1] + } + return null + } +} + +var commandsRegEx = /^remix:(debug|loadgist|setproviderurl|loadurl|batch)(.*)/ + +module.exports = CmdInterpreter