blob: 78cfc3e4fdc038a93e7d1be8f9669a99de2e4a0e [file] [log] [blame]
//
// Created by Tyler on 10/6/20.
//
#include <iosfwd>
#include "assignment-or.hpp"
namespace ndn {
namespace ndncert {
NDNCERT_REGISTER_FUNCFACTORY(AssignmentOr, "or");
AssignmentOr::AssignmentOr()
: NameAssignmentFuncFactory("or")
{
}
NameAssignmentFunc
AssignmentOr::getFunction(std::list<NameAssignmentFunc> funcs){
if (funcs.size() == 1) return *funcs.begin();
return [funcs](const std::vector<std::tuple<std::string, std::string>> params){
std::vector<PartialName> nameList;
for (const auto& func : funcs) {
auto result = func(params);
nameList.insert(nameList.end(), result.begin(), result.end());
}
return nameList;
};
}
NameAssignmentFunc
AssignmentOr::getFunction(const std::string &factoryParam) {
std::list<NameAssignmentFunc> paramList;
std::stringstream ss;
ss << factoryParam;
JsonSection section;
try {
boost::property_tree::read_json(ss, section);
}
catch (const std::exception& error) {
BOOST_THROW_EXCEPTION(std::runtime_error(std::string("Failed to parse configuration for name assignment function or, ") + error.what()));
}
if (section.begin() == section.end()) {
BOOST_THROW_EXCEPTION(std::runtime_error("No JSON configuration found for name assignment function"));
}
for (const auto& item: section) {
auto factory = NameAssignmentFuncFactory::createNameAssignmentFuncFactory(item.first);
if (!factory) {
BOOST_THROW_EXCEPTION(std::runtime_error("Invalid assignment factory type"));
}
try {
paramList.push_back(factory->getFunction(item.second.data()));
} catch (const std::exception& e) {
BOOST_THROW_EXCEPTION(std::runtime_error("Error on creating function"));
}
}
return getFunction(paramList);
}
}
}