blob: 55402a6a95910a2d551ff37f36ec8389c29d322b [file] [log] [blame]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_REDFISH_ENTITY_TRIE_NODE_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_REDFISH_ENTITY_TRIE_NODE_H_
#include <cstddef>
#include <limits>
#include <memory>
#include <string>
#include <string_view>
#include "absl/container/flat_hash_map.h"
#include "authorizer_enums.h"
namespace milotic::authz::internal {
class RedfishEntityTrieNode {
public:
// Have to create a default constructor for the root
RedfishEntityTrieNode() = default;
// For purposes of inserting a uri, we will need to return a modifiable
// RedfishEntityTrieNode pointer. This method encapsulates this as it will
// either get a modifiable pointer to a child that exists or create a child
// that doesn't exist and return its pointer to be modified when inserting
// uris into the Trie.
RedfishEntityTrieNode* GetOrDefaultChild(std::string_view path);
// For purposes of getting an entity type from the uri, we can have a separate
// Get method that is marked const to prevent the Trie from being modified
// when only querying it.
RedfishEntityTrieNode* GetChild(std::string_view path) const;
ecclesia::ResourceEntity GetEntityTag() const;
void SetEntityTag(ecclesia::ResourceEntity tag);
std::size_t GetNodeIndexInPatternArray() const;
void SetNodeIndexInPatternArray(std::size_t index);
bool IsCollection() const;
void SetCollection(bool collection);
private:
absl::flat_hash_map<std::string, std::unique_ptr<RedfishEntityTrieNode>>
children_;
ecclesia::ResourceEntity entity_tag_;
std::size_t node_index_in_pattern_array_ =
std::numeric_limits<std::size_t>::max();
// If this current node is a collection, it will be set true later. Default to
// false
// Read more about resource collections on page 28 below
// https://www.dmtf.org/sites/default/files/standards/documents/DSP2046_2020.3_1.pdf
bool collection_ = false;
};
} // namespace milotic::authz::internal
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_REDFISH_ENTITY_TRIE_NODE_H_