Мне нужно построить какое-то дерево зависимостей в C ++ при выполнении вызовов REST API к внутренней службе.
У меня есть служба API (поддерживается не мной), которая может предоставить мне некоторые данные. Он предоставляет пользователям, у каждого пользователя есть набор категорий, они могут быть вложенными. У каждой категории есть Предметы. Элементы не могут быть вложенными. Это похоже на обычную иерархию файловой системы:
User-1
....Category-1
........Item-1
........Category-2
............Item-2
............Item-3
....Category-3
User-2
....Category-4
........Item-4
....Category-5
........Item-5
........Item-6
У меня есть доступ только к этим методам API, и я не могу их изменить:
std::vector<User> GetUsers();
std::vector<Category> GetCategories(std::string userId, std::string categoryId = ""); // Empty categoryId = root Category. Returns only 1-level child categories.
std::vector<Item> GetItems(std::string categoryId);
Я должен представлять все элементы как узлы, используя эти 3 вызова API. Существует структура, которая представляет Node - User, Category, Item и все остальное. Я должен использовать эту структуру и не имею возможности ее изменить:
enum NodeType
{
UNDEFINED = -1,
USER,
CATEGORY,
ITEM,
COUNT
};
struct Node
{
std::size_t id;
std::size_t parentId;
std::string name;
NodeType type;
};
Я решил поместить все узлы в std::unordered_multimap<std::size_t, Node>
. ID узла - это ключ, а все дочерние элементы этого узла - значения.
Итак, каков наиболее эффективный и элегантный способ заполнения unordered_multimap созданными узлами при выполнении запросов к службе API?
Я придумал это:
std::unordered_multimap<std::size_t, Node> EnumerateNodes()
{
size_t nodeId = 0;
std::unordered_multimap<std::size_t, Node> result;
Node rootNode = {nodeId + 1, nodeId, "RootNode", NodeType::ROOT};
result.insert(std::make_pair(nodeId, rootNode));
auto users = GetUsers();
for (const auto& user : users)
{
// Create node for each user and recursively get his categories and items?
// How to deal with parent ids while going through all categories?
}
return result;
}
Итак, у меня проблема: как эффективно управлять parentId и текущим идентификатором узла при переборе ответа API? Как выбрать все категории и элементы и правильно разместить их на мультикарте?
Заранее спасибо!