Estoy jugando con la creación de módulos Node.js en C++, pero estoy perplejo en la clase v8 :: Arguments. Digamos que tengo una clase Javascript para enviar mensajes de correo electrónico, el cual tiene un método con esta firma:Conversión de v8 :: Argumentos a C++ Tipos
Mailer::sendEmail(Array recipients, String sender, String message);
cual se llamaría así:
mailer.sendEmail(["[email protected]", "[email protected]"], "[email protected]", "Hi there");
Ahora en C tierra ++, tengo una función de clase con esta firma:
SendEmail(const v8::Arguments& args)
Que está respaldando mi método Mailer :: sendEmail en Javascript land. La función SendEmail va a crear una nueva instancia de mi clase Emailer, que a su vez tiene una función de clase con esta firma:
send(std::list<std::string> recipients, std::string from, std::string message)
Y aquí es donde estoy perdido. No sé cómo tomar los valores de args, y convertirlos en tipos regulares de C++, por lo que puedo pasar los valores a mi enviar la función. Según lo entiendo, los 3 valores pasados a Mailer :: sendEmail estarán disponibles en args [0], args [1], y args [2]. Incluso entiendo que puedo hacer algún tipo de comprobación como if (!args[0]->IsArray())
, pero en realidad convertir args [0] en std::list<std::string>
es lo que no sé cómo hacer.
Edité: Encontré una forma hackosa de hacer esto, pero sigo pensando que V8 tiene algunos métodos integrados para manejar esto de una manera más limpia.
static Handle<Value> SendEmail(const Arguments& args)
{
HandleScope scope;
list<string> values;
Local<Object> obj = args[0]->ToObject();
Local<Array> props = obj->GetPropertyNames();
// Iterate through args[0], adding each element to our list
for(unsigned int i = 0; i < props->Length(); i++) {
String::AsciiValue val(obj->Get(i)->ToString());
values.push_front(string(*val));
}
// Display the values in the list for debugging purposes
for (list<string>::iterator it = values.begin(); it != values.end(); it++) {
cout << *it << endl;
}
return scope.Close(args.This());
}
@Thomas Esa respuesta es dolorosamente * * vaga. Además, hay maneras indudablemente correctas de convertir los args a tipos de C++ en V8. – mellowsoon
@mellowsoon que lo está poniendo amablemente – hplbsh