@@ -315,8 +315,8 @@ bool command_cb_exit(application & app, tokenizer & /*t*/)
315315
316316/* -- Methods -- */
317317
318- application::parameter_iterator::parameter_iterator (application & app, const char * command, const char * tag, application::arg_list & arguments ) :
319- app(app), command(command), tag(tag), arguments(arguments)
318+ application::parameter_iterator::parameter_iterator (application & app) :
319+ app(app)
320320{
321321
322322}
@@ -328,115 +328,22 @@ application::parameter_iterator::~parameter_iterator()
328328
329329void application::parameter_iterator::operator ()(const char * parameter)
330330{
331- arguments.push_back (parameter);
332- }
333-
334- void application::parameter_iterator::evaluate ()
335- {
336- typedef std::function<void (application &, const std::string &, const std::string &, application::arg_list &)> parameter_callback;
331+ std::string script (parameter);
337332
338- /* List of scripts that run pip/npm/gem */
339- static std::unordered_map<std::string, std::string> install_scripts =
333+ static std::unordered_map<std::string, std::string> extension_to_tag =
340334 {
341- {
342- " py" ,
343-
344- " #!/usr/bin/env python3\n "
345- " \n "
346- " try:\n "
347- " from pip import main as pipmain\n "
348- " except ImportError:\n "
349- " from pip._internal import main as pipmain\n "
350- " \n "
351- " def package_manager(args):\n "
352- " return pipmain(args);\n "
353- },
354- {
355- " node" ,
356-
357- " const path = require('path');\n "
358- " let npm = { package_manager: function (args) { console.log('NPM could not be found, please set up LOADER_LIBRARY_PATH enviroment variable,'); } };\n "
359- " try {\n "
360- " npm = require(path.join(process.env['LOADER_LIBRARY_PATH'], 'npm.js'));\n "
361- " } catch (e) {\n "
362- " console.log(e);\n "
363- " }\n "
364- " module.exports = npm;\n "
365- }
335+ { " mock" , " mock" },
336+ { " py" , " py" },
337+ { " js" , " node" },
338+ { " rb" , " rb" },
339+ { " cs" , " cs" }
366340 };
367341
368- /* List of available commands when installing */
369- static std::unordered_map<std::string, parameter_callback> parameter_commands =
370- {
371- {
372- " load" , [](application & app, const std::string & tag, const std::string &, application::arg_list & args)
373- {
374- std::for_each (args.begin (), args.end (), [&app, &tag](const std::string & script)
375- {
376- app.load (tag, script);
377- });
378- }
379- },
380- {
381- " install" , [](application & app, const std::string & tag, const std::string & command, application::arg_list & args)
382- {
383- const std::string & script = install_scripts[tag];
384-
385- if (script == " " )
386- {
387- std::cout << " Package manager script not available for tag (" << tag << " )" << std::endl;
388-
389- app.shutdown ();
390-
391- return ;
392- }
393-
394- if (metacall_load_from_memory (tag.c_str (), script.c_str (), script.size (), NULL ) != 0 )
395- {
396- std::cout << " Error when loading (" << tag << " ) package manager script" << std::endl;
397-
398- app.shutdown ();
342+ const std::string tag = extension_to_tag[script.substr (script.find_last_of (" ." ) + 1 )];
399343
400- return ;
401- }
402-
403- void * args_values[1 ] =
404- {
405- metacall_value_create_array (NULL , args.size () + 1 )
406- };
407-
408- void ** array_value = static_cast <void **>(metacall_value_to_array (args_values[0 ]));
409-
410- size_t iterator = 0 ;
411-
412- array_value[iterator++] = metacall_value_create_string (command.c_str (), command.length ());
413-
414- std::for_each (args.begin (), args.end (), [&array_value, &iterator](const std::string & arg)
415- {
416- array_value[iterator++] = metacall_value_create_string (arg.c_str (), arg.length ());
417- });
418-
419- void * result = metacallv (" package_manager" , args_values);
420-
421- metacall_value_destroy (args_values[0 ]);
422-
423- /* TODO: Do something with result */
424-
425- if (result != NULL )
426- {
427- metacall_value_destroy (result);
428- }
429-
430- app.shutdown ();
431- }
432- }
433- };
434-
435- const parameter_callback cb = parameter_commands[command];
436-
437- if (cb != nullptr )
344+ if (!app.load (tag, script))
438345 {
439- cb ( app, tag, command, arguments );
346+ app. shutdown ( );
440347 }
441348}
442349
@@ -548,16 +455,13 @@ application::application(int argc, char * argv[]) : exit_condition(false), log_p
548455 /* Print MetaCall information */
549456 metacall_print_info ();
550457
551- /* Parse program arguments if any (e.g metacall (0) load (1) py (2) asd.py (3)) */
552- if (argc > 3 )
458+ /* Parse program arguments if any (e.g metacall (0) a.py (1) b.js (2) c.rb (3)) */
459+ if (argc > 1 )
553460 {
554- parameter_iterator param_it (*this , argv[ 1 ], argv[ 2 ], arguments );
461+ parameter_iterator param_it (*this );
555462
556463 /* Parse program parameters */
557- std::for_each (&argv[3 ], argv + argc, param_it);
558-
559- /* Execute the action */
560- param_it.evaluate ();
464+ std::for_each (&argv[1 ], argv + argc, param_it);
561465 }
562466
563467 /* Define available commands */
0 commit comments