/* Copyright (C) 2016 -2017 Jerry Jin */ #include #include #include "overnightindexedswap.hpp" #include #include #include #include #include #include #include #include #include #include #include #include "../loop.hpp" void OvernightIndexedSwapWorker::Execute(){ try{ // convert input datatypes to QuantLib enumerated datatypes QuantLib::OvernightIndexedSwap::Type PayerReceiverEnum = ObjectHandler::Create()(mPayerReceiver); // convert input datatypes to QuantLib datatypes std::vector NominalLib = QuantLibAddin::convertVector(mNominal); // convert object IDs into library objects OH_GET_REFERENCE(ScheduleLibObjPtr, mSchedule, QuantLibAddin::Schedule, QuantLib::Schedule) // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter FixDayCounterEnum = ObjectHandler::Create()(mFixDayCounter); // convert object IDs into library objects OH_GET_REFERENCE(OvernightIndexLibObjPtr, mOvernightIndex, QuantLibAddin::OvernightIndex, QuantLib::OvernightIndex) // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlOvernightIndexedSwap( mObjectID, mPayerReceiver, mNominal, mSchedule, mFixedRate, mFixDayCounter, mOvernightIndex, mSpread, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::OvernightIndexedSwap( valueObject, PayerReceiverEnum, mNominal, ScheduleLibObjPtr, mFixedRate, FixDayCounterEnum, OvernightIndexLibObjPtr, mSpread, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwap) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsString()) { return Nan::ThrowError("PayerReceiver is required."); } if (info.Length() == 2 || !info[2]->IsArray()) { return Nan::ThrowError("Nominal is required."); } if (info.Length() == 3 || !info[3]->IsString()) { return Nan::ThrowError("Schedule is required."); } if (info.Length() == 4 || !info[4]->IsNumber()) { return Nan::ThrowError("FixedRate is required."); } if (info.Length() == 5 || !info[5]->IsString()) { return Nan::ThrowError("FixDayCounter is required."); } if (info.Length() == 6 || !info[6]->IsString()) { return Nan::ThrowError("OvernightIndex is required."); } if (info.Length() == 7 || !info[7]->IsNumber()) { return Nan::ThrowError("Spread is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type String::Utf8Value strPayerReceiver(info[1]->ToString()); string PayerReceiverCpp(strdup(*strPayerReceiver)); // convert js argument to c++ type std::vectorNominalCpp; Local NominalArray = info[2].As(); for (unsigned int i = 0; i < NominalArray->Length(); i++){ NominalCpp.push_back(Nan::To(Nan::Get(NominalArray, i).ToLocalChecked()).FromJust()); } // convert js argument to c++ type String::Utf8Value strSchedule(info[3]->ToString()); string ScheduleCpp(strdup(*strSchedule)); // convert js argument to c++ type double FixedRateCpp = Nan::To(info[4]).FromJust(); // convert js argument to c++ type String::Utf8Value strFixDayCounter(info[5]->ToString()); string FixDayCounterCpp(strdup(*strFixDayCounter)); // convert js argument to c++ type String::Utf8Value strOvernightIndex(info[6]->ToString()); string OvernightIndexCpp(strdup(*strOvernightIndex)); // convert js argument to c++ type double SpreadCpp = Nan::To(info[7]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[8].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapWorker( callback ,ObjectIDCpp ,PayerReceiverCpp ,NominalCpp ,ScheduleCpp ,FixedRateCpp ,FixDayCounterCpp ,OvernightIndexCpp ,SpreadCpp )); } //OvernightIndexedSwapWorker::~OvernightIndexedSwapWorker(){ // //} //void OvernightIndexedSwapWorker::Destroy(){ // //} void MakeOISWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Natural SettlDaysLib = ObjectHandler::convert2( mSettlDays, "SettlDays", QuantLib::Null()); // convert input datatypes to QuantLib datatypes QuantLib::Period SwapTenorLib; QuantLibAddin::cppToLibrary(mSwapTenor, SwapTenorLib); // convert object IDs into library objects OH_GET_REFERENCE(OvernightIndexLibObjPtr, mOvernightIndex, QuantLibAddin::OvernightIndex, QuantLib::OvernightIndex) // convert input datatypes to QuantLib datatypes QuantLib::Period ForwardStartLib; QuantLibAddin::cppToLibrary(mForwardStart, ForwardStartLib); // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter FixDayCounterEnum = ObjectHandler::Create()(mFixDayCounter); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlMakeOIS( mObjectID, mSettlDays, mSwapTenor, mOvernightIndex, mFixedRate, mForwardStart, mFixDayCounter, mSpread, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::OvernightIndexedSwap( valueObject, SettlDaysLib, SwapTenorLib, OvernightIndexLibObjPtr, mFixedRate, ForwardStartLib, FixDayCounterEnum, mSpread, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void MakeOISWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::MakeOIS) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 2 || !info[2]->IsString()) { return Nan::ThrowError("SwapTenor is required."); } if (info.Length() == 3 || !info[3]->IsString()) { return Nan::ThrowError("OvernightIndex is required."); } if (info.Length() == 4 || !info[4]->IsNumber()) { return Nan::ThrowError("FixedRate is required."); } if (info.Length() == 5 || !info[5]->IsString()) { return Nan::ThrowError("ForwardStart is required."); } if (info.Length() == 6 || !info[6]->IsString()) { return Nan::ThrowError("FixDayCounter is required."); } if (info.Length() == 7 || !info[7]->IsNumber()) { return Nan::ThrowError("Spread is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type ObjectHandler::property_t SettlDaysCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // convert js argument to c++ type String::Utf8Value strSwapTenor(info[2]->ToString()); string SwapTenorCpp(strdup(*strSwapTenor)); // convert js argument to c++ type String::Utf8Value strOvernightIndex(info[3]->ToString()); string OvernightIndexCpp(strdup(*strOvernightIndex)); // convert js argument to c++ type double FixedRateCpp = Nan::To(info[4]).FromJust(); // convert js argument to c++ type String::Utf8Value strForwardStart(info[5]->ToString()); string ForwardStartCpp(strdup(*strForwardStart)); // convert js argument to c++ type String::Utf8Value strFixDayCounter(info[6]->ToString()); string FixDayCounterCpp(strdup(*strFixDayCounter)); // convert js argument to c++ type double SpreadCpp = Nan::To(info[7]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[8].As()); // launch Async worker Nan::AsyncQueueWorker(new MakeOISWorker( callback ,ObjectIDCpp ,SettlDaysCpp ,SwapTenorCpp ,OvernightIndexCpp ,FixedRateCpp ,ForwardStartCpp ,FixDayCounterCpp ,SpreadCpp )); } //MakeOISWorker::~MakeOISWorker(){ // //} //void MakeOISWorker::Destroy(){ // //} void MakeDatedOISWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Date StartDateLib = ObjectHandler::convert2( mStartDate, "StartDate"); // convert input datatypes to QuantLib datatypes QuantLib::Date EndDateLib = ObjectHandler::convert2( mEndDate, "EndDate"); // convert object IDs into library objects OH_GET_REFERENCE(OvernightIndexLibObjPtr, mOvernightIndex, QuantLibAddin::OvernightIndex, QuantLib::OvernightIndex) // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter FixDayCounterEnum = ObjectHandler::Create()(mFixDayCounter); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlMakeDatedOIS( mObjectID, mStartDate, mEndDate, mOvernightIndex, mFixedRate, mFixDayCounter, mSpread, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::OvernightIndexedSwap( valueObject, StartDateLib, EndDateLib, OvernightIndexLibObjPtr, mFixedRate, FixDayCounterEnum, mSpread, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void MakeDatedOISWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::MakeDatedOIS) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 3 || !info[3]->IsString()) { return Nan::ThrowError("OvernightIndex is required."); } if (info.Length() == 4 || !info[4]->IsNumber()) { return Nan::ThrowError("FixedRate is required."); } if (info.Length() == 5 || !info[5]->IsString()) { return Nan::ThrowError("FixDayCounter is required."); } if (info.Length() == 6 || !info[6]->IsNumber()) { return Nan::ThrowError("Spread is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type ObjectHandler::property_t StartDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // convert js argument to c++ type ObjectHandler::property_t EndDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[2]).FromJust())); // convert js argument to c++ type String::Utf8Value strOvernightIndex(info[3]->ToString()); string OvernightIndexCpp(strdup(*strOvernightIndex)); // convert js argument to c++ type double FixedRateCpp = Nan::To(info[4]).FromJust(); // convert js argument to c++ type String::Utf8Value strFixDayCounter(info[5]->ToString()); string FixDayCounterCpp(strdup(*strFixDayCounter)); // convert js argument to c++ type double SpreadCpp = Nan::To(info[6]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[7].As()); // launch Async worker Nan::AsyncQueueWorker(new MakeDatedOISWorker( callback ,ObjectIDCpp ,StartDateCpp ,EndDateCpp ,OvernightIndexCpp ,FixedRateCpp ,FixDayCounterCpp ,SpreadCpp )); } //MakeDatedOISWorker::~MakeDatedOISWorker(){ // //} //void MakeDatedOISWorker::Destroy(){ // //} void OvernightIndexedSwapFromOISRateHelperWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(OISRateHelperLibObjPtr, mOISRateHelper, QuantLibAddin::OISRateHelper, QuantLib::OISRateHelper) // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlOvernightIndexedSwapFromOISRateHelper( mObjectID, mOISRateHelper, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::OvernightIndexedSwap( valueObject, OISRateHelperLibObjPtr, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFromOISRateHelperWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFromOISRateHelper) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsString()) { return Nan::ThrowError("OISRateHelper is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type String::Utf8Value strOISRateHelper(info[1]->ToString()); string OISRateHelperCpp(strdup(*strOISRateHelper)); // declare callback Nan::Callback *callback = new Nan::Callback(info[2].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFromOISRateHelperWorker( callback ,ObjectIDCpp ,OISRateHelperCpp )); } //OvernightIndexedSwapFromOISRateHelperWorker::~OvernightIndexedSwapFromOISRateHelperWorker(){ // //} //void OvernightIndexedSwapFromOISRateHelperWorker::Destroy(){ // //} void OvernightIndexedSwapFixedLegBPSWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->fixedLegBPS( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFixedLegBPSWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFixedLegBPS) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFixedLegBPSWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapFixedLegBPSWorker::~OvernightIndexedSwapFixedLegBPSWorker(){ // //} //void OvernightIndexedSwapFixedLegBPSWorker::Destroy(){ // //} void OvernightIndexedSwapFixedLegNPVWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->fixedLegNPV( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFixedLegNPVWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFixedLegNPV) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFixedLegNPVWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapFixedLegNPVWorker::~OvernightIndexedSwapFixedLegNPVWorker(){ // //} //void OvernightIndexedSwapFixedLegNPVWorker::Destroy(){ // //} void OvernightIndexedSwapFairRateWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->fairRate( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFairRateWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFairRate) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFairRateWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapFairRateWorker::~OvernightIndexedSwapFairRateWorker(){ // //} //void OvernightIndexedSwapFairRateWorker::Destroy(){ // //} void OvernightIndexedSwapOvernightLegBPSWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->overnightLegBPS( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapOvernightLegBPSWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapOvernightLegBPS) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapOvernightLegBPSWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapOvernightLegBPSWorker::~OvernightIndexedSwapOvernightLegBPSWorker(){ // //} //void OvernightIndexedSwapOvernightLegBPSWorker::Destroy(){ // //} void OvernightIndexedSwapOvernightLegNPVWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->overnightLegNPV( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapOvernightLegNPVWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapOvernightLegNPV) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapOvernightLegNPVWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapOvernightLegNPVWorker::~OvernightIndexedSwapOvernightLegNPVWorker(){ // //} //void OvernightIndexedSwapOvernightLegNPVWorker::Destroy(){ // //} void OvernightIndexedSwapFairSpreadWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->fairSpread( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFairSpreadWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFairSpread) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFairSpreadWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapFairSpreadWorker::~OvernightIndexedSwapFairSpreadWorker(){ // //} //void OvernightIndexedSwapFairSpreadWorker::Destroy(){ // //} void OvernightIndexedSwapTypeWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function QuantLib::OvernightIndexedSwap::Type returnValue = ObjectIDLibObjPtr->type( ); std::ostringstream os; os << returnValue; mReturnValue = os.str(); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapTypeWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapType) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapTypeWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapTypeWorker::~OvernightIndexedSwapTypeWorker(){ // //} //void OvernightIndexedSwapTypeWorker::Destroy(){ // //} void OvernightIndexedSwapNominalWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->nominal( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapNominalWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapNominal) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapNominalWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapNominalWorker::~OvernightIndexedSwapNominalWorker(){ // //} //void OvernightIndexedSwapNominalWorker::Destroy(){ // //} void OvernightIndexedSwapFixedRateWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->fixedRate( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFixedRateWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFixedRate) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFixedRateWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapFixedRateWorker::~OvernightIndexedSwapFixedRateWorker(){ // //} //void OvernightIndexedSwapFixedRateWorker::Destroy(){ // //} void OvernightIndexedSwapFixedDayCountWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function QuantLib::DayCounter returnValue = ObjectIDLibObjPtr->fixedDayCount( ); std::ostringstream os; os << returnValue; mReturnValue = os.str(); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFixedDayCountWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFixedDayCount) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFixedDayCountWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapFixedDayCountWorker::~OvernightIndexedSwapFixedDayCountWorker(){ // //} //void OvernightIndexedSwapFixedDayCountWorker::Destroy(){ // //} void OvernightIndexedSwapSpreadWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap, QuantLib::OvernightIndexedSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->spread( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapSpreadWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapSpread) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapSpreadWorker( callback ,ObjectIDCpp )); } //OvernightIndexedSwapSpreadWorker::~OvernightIndexedSwapSpreadWorker(){ // //} //void OvernightIndexedSwapSpreadWorker::Destroy(){ // //} void OvernightIndexedSwapFixedLegAnalysisWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Date AfterDateLib = ObjectHandler::convert2( mAfterDate, "AfterDate"); // convert object IDs into library objects OH_GET_OBJECT(ObjectIDObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap) std::vector< std::vector > returnValue; // invoke the member function returnValue = ObjectIDObjPtr->fixedLegAnalysis( AfterDateLib ); mReturnValue = ObjectHandler::matrix::convert2(returnValue,"returnValue"); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapFixedLegAnalysisWorker::HandleOKCallback(){ Nan::HandleScope scope; Local tmpMatrix = Nan::New(mReturnValue.size()); for (unsigned int i = 0; i < mReturnValue.size(); i++) { Local tmpArray = Nan::New(mReturnValue[i].size()); for (unsigned int j = 0; j < mReturnValue[i].size(); j++) { Nan::Set(tmpArray,j,Nan::New(mReturnValue[i][j]).ToLocalChecked()); } Nan::Set(tmpMatrix,i,tmpArray); } Local argv[2] = { Nan::New(mError).ToLocalChecked(), tmpMatrix }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapFixedLegAnalysis) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type ObjectHandler::property_t AfterDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // declare callback Nan::Callback *callback = new Nan::Callback(info[2].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapFixedLegAnalysisWorker( callback ,ObjectIDCpp ,AfterDateCpp )); } //OvernightIndexedSwapFixedLegAnalysisWorker::~OvernightIndexedSwapFixedLegAnalysisWorker(){ // //} //void OvernightIndexedSwapFixedLegAnalysisWorker::Destroy(){ // //} void OvernightIndexedSwapOvernightLegAnalysisWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Date AfterDateLib = ObjectHandler::convert2( mAfterDate, "AfterDate"); // convert object IDs into library objects OH_GET_OBJECT(ObjectIDObjPtr, mObjectID, QuantLibAddin::OvernightIndexedSwap) std::vector< std::vector > returnValue; // invoke the member function returnValue = ObjectIDObjPtr->overnightLegAnalysis( AfterDateLib ); mReturnValue = ObjectHandler::matrix::convert2(returnValue,"returnValue"); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void OvernightIndexedSwapOvernightLegAnalysisWorker::HandleOKCallback(){ Nan::HandleScope scope; Local tmpMatrix = Nan::New(mReturnValue.size()); for (unsigned int i = 0; i < mReturnValue.size(); i++) { Local tmpArray = Nan::New(mReturnValue[i].size()); for (unsigned int j = 0; j < mReturnValue[i].size(); j++) { Nan::Set(tmpArray,j,Nan::New(mReturnValue[i][j]).ToLocalChecked()); } Nan::Set(tmpMatrix,i,tmpArray); } Local argv[2] = { Nan::New(mError).ToLocalChecked(), tmpMatrix }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::OvernightIndexedSwapOvernightLegAnalysis) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type ObjectHandler::property_t AfterDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // declare callback Nan::Callback *callback = new Nan::Callback(info[2].As()); // launch Async worker Nan::AsyncQueueWorker(new OvernightIndexedSwapOvernightLegAnalysisWorker( callback ,ObjectIDCpp ,AfterDateCpp )); } //OvernightIndexedSwapOvernightLegAnalysisWorker::~OvernightIndexedSwapOvernightLegAnalysisWorker(){ // //} //void OvernightIndexedSwapOvernightLegAnalysisWorker::Destroy(){ // //}