/* Copyright (c) 2016 Devis, MIT License */
#include "node.h"
#include "devisPattern.hpp"
//TStrStrMap devisPattern::devisPattern::tMap;
namespace devisPattern {
using v8::Context;
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::Persistent;
using v8::String;
using v8::Value;
Persistent devisPattern::constructor;
devisPattern::devisPattern(){
}
devisPattern::~devisPattern() {
}
void devisPattern::Init(Local exports) {
Isolate* isolate = exports->GetIsolate();
Local tpl = FunctionTemplate::New(isolate, New);
tpl->SetClassName(String::NewFromUtf8(isolate, "devisPattern"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
NODE_SET_PROTOTYPE_METHOD(tpl, "add", add);
NODE_SET_PROTOTYPE_METHOD(tpl, "list", list);
NODE_SET_PROTOTYPE_METHOD(tpl, "find", find);
constructor.Reset(isolate, tpl->GetFunction());
exports->Set(String::NewFromUtf8(isolate, "devisPattern"),
tpl->GetFunction());
}
void devisPattern::New(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();
if (args.IsConstructCall()) {
devisPattern* obj = new devisPattern();
obj->Wrap(args.This());
args.GetReturnValue().Set(args.This());
} else {
const int argc = 1;
Local argv[argc] = { args[0] };
Local cons = Local::New(isolate, constructor);
Local context = isolate->GetCurrentContext();
Local instance =
cons->NewInstance(context, argc, argv).ToLocalChecked();
args.GetReturnValue().Set(instance);
}
}
void devisPattern::NewInstance(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();
const unsigned argc = 1;
Local argv[argc] = { args[0] };
Local cons = Local::New(isolate, constructor);
Local context = isolate->GetCurrentContext();
Local instance =
cons->NewInstance(context, argc, argv).ToLocalChecked();
args.GetReturnValue().Set(instance);
}
TStrStrMap::const_iterator FindPath(const TStrStrMap& map, const string& path) {
TStrStrMap::const_iterator i = map.find(path);
//std::this_thread::sleep_for(std::chrono::seconds(1));
return i;
}
string liste(TStrStrMap& tMap)
{
string res="[";
for(it_type iterator = tMap.begin(); iterator != tMap.end(); iterator++) {
if(iterator!=tMap.begin()) res+=",";
res+=iterator->first;
}
res+="]";
return res;
}
int TFind(const TStrStrMap& map, const string& path) {
auto i = FindPath(map, path);
if (i != map.end()) return i->second;
return -1 ;
}
void devisPattern::find(const v8::FunctionCallbackInfo& args)
{
int data;
v8::String::Utf8Value _path(args[0]->ToString());
auto ptr = Unwrap(args.Holder());
data=TFind(ptr->tMap, *_path);
args.GetReturnValue().Set(data);
}
void devisPattern::list(const v8::FunctionCallbackInfo& args)
{
Isolate* isolate=Isolate::GetCurrent();
auto ptr = Unwrap(args.Holder());
args.GetReturnValue().Set(String::NewFromUtf8(isolate, liste(ptr->tMap).c_str()));
}
void devisPattern::add(const FunctionCallbackInfo& args) {
auto id=args[1]->Int32Value();
auto ptr = Unwrap(args.Holder());
v8::String::Utf8Value _path(args[0]->ToString());
ptr->tMap.insert(TStrStrPair(*_path,id));
}
}