blob: cd1f3066b71da7385344f04a357057a225ca94a8 [file] [log] [blame]
tylerliubcd83482020-10-07 14:45:28 -07001//
2// Created by Tyler on 10/6/20.
3//
4
5#include <iosfwd>
6#include "assignment-or.hpp"
7
8namespace ndn {
9namespace ndncert {
10
11_LOG_INIT(ndncert.assignment.or);
12
13NDNCERT_REGISTER_FUNCFACTORY(AssignmentOr, "or");
14
15AssignmentOr::AssignmentOr()
16 : NameAssignmentFuncFactory("or")
17{
18}
19
20NameAssignmentFunc
21AssignmentOr::getFunction(std::list<NameAssignmentFunc> funcs){
22 if (funcs.size() == 1) return *funcs.begin();
23 return OrAssignmentFunc(funcs);
24}
25
26NameAssignmentFunc
27AssignmentOr::getFunction(const std::string &factoryParam) {
28 std::list<NameAssignmentFunc> paramList;
29 std::stringstream ss;
30 ss << factoryParam;
31 JsonSection section;
32 try {
33 boost::property_tree::read_json(ss, section);
34 }
35 catch (const std::exception& error) {
36 BOOST_THROW_EXCEPTION(std::runtime_error(std::string("Failed to parse configuration for name assignment function or, ") + error.what()));
37 }
38 if (section.begin() == section.end()) {
39 BOOST_THROW_EXCEPTION(std::runtime_error("No JSON configuration found for name assignment function"));
40 }
41 for (const auto& item: section) {
42 auto factory = NameAssignmentFuncFactory::createNameAssignmentFuncFactory(item.first);
43 if (!factory) {
44 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid assignment factory type"));
45 }
46 try {
47 paramList.push_back(factory->getFunction(item.second.data()));
48 } catch (const std::exception& e) {
49 BOOST_THROW_EXCEPTION(std::runtime_error("Error on creating function"));
50 }
51 }
52
53 return getFunction(paramList);
54}
55
56AssignmentOr::OrAssignmentFunc::OrAssignmentFunc(std::list<NameAssignmentFunc> funcList)
57 : m_funcList(std::move(funcList))
58{}
59
60std::vector<PartialName>
61AssignmentOr::OrAssignmentFunc::operator() (const std::vector<std::tuple<std::string, std::string>> params)
62{
63 std::vector<PartialName> nameList;
64 for (const auto& func : m_funcList) {
65 auto result = func(params);
66 nameList.insert(nameList.end(), result.begin(), result.end());
67 }
68
69 return nameList;
70}
71
72}
73}