blob: cd1f3066b71da7385344f04a357057a225ca94a8 [file] [log] [blame]
//
// Created by Tyler on 10/6/20.
//
#include <iosfwd>
#include "assignment-or.hpp"
namespace ndn {
namespace ndncert {
_LOG_INIT(ndncert.assignment.or);
NDNCERT_REGISTER_FUNCFACTORY(AssignmentOr, "or");
AssignmentOr::AssignmentOr()
: NameAssignmentFuncFactory("or")
{
}
NameAssignmentFunc
AssignmentOr::getFunction(std::list<NameAssignmentFunc> funcs){
if (funcs.size() == 1) return *funcs.begin();
return OrAssignmentFunc(funcs);
}
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);
}
AssignmentOr::OrAssignmentFunc::OrAssignmentFunc(std::list<NameAssignmentFunc> funcList)
: m_funcList(std::move(funcList))
{}
std::vector<PartialName>
AssignmentOr::OrAssignmentFunc::operator() (const std::vector<std::tuple<std::string, std::string>> params)
{
std::vector<PartialName> nameList;
for (const auto& func : m_funcList) {
auto result = func(params);
nameList.insert(nameList.end(), result.begin(), result.end());
}
return nameList;
}
}
}