| #include "redfish_entity_trie_node.h" | |
| #include <cstddef> | |
| #include <memory> | |
| #include <string> | |
| #include <string_view> | |
| #include <utility> | |
| #include "absl/strings/string_view.h" | |
| #include "authorizer_enums.h" | |
| namespace milotic::authz::internal { | |
| // In GetOrDefault, because it serves for creating a new node, we first check | |
| // if there's a exact match for the path, if not, we create a new node for the | |
| // path and return its pointer. Note that we would create at most one node for | |
| // the wildcard. | |
| RedfishEntityTrieNode* RedfishEntityTrieNode::GetOrDefaultChild( | |
| std::string_view path) { | |
| auto it = children_.find(path); | |
| if (it != children_.end()) { | |
| return it->second.get(); | |
| } | |
| if (IsWildcard(path)) { | |
| if (collection_child_ != nullptr) { | |
| return collection_child_; | |
| } | |
| // If there is no collection child, create a new one. | |
| auto [inserted_it, _] = children_.insert( | |
| {std::string(path), std::make_unique<RedfishEntityTrieNode>()}); | |
| collection_child_ = inserted_it->second.get(); | |
| return collection_child_; | |
| } | |
| // If there is no exact match and no wildcard, create a new node for the path | |
| // and return its pointer. | |
| auto [inserted_it, _] = children_.insert( | |
| {std::string(path), std::make_unique<RedfishEntityTrieNode>()}); | |
| return inserted_it->second.get(); | |
| } | |
| // In GetChild, we first check if there's a exact match for the path. If not, we | |
| // check if there is a wildcard. If it is, we return the wildcard. | |
| RedfishEntityTrieNode* RedfishEntityTrieNode::GetChild( | |
| std::string_view path) const { | |
| auto it = children_.find(path); | |
| if (it != children_.end()) { | |
| return it->second.get(); | |
| } | |
| // If there is no exact match, return the collection child if it exists | |
| // otherwise the collection child is a nullptr. | |
| return collection_child_; | |
| } | |
| ecclesia::ResourceEntity RedfishEntityTrieNode::GetEntityTag() const { | |
| return entity_tag_; | |
| } | |
| void RedfishEntityTrieNode::SetEntityTag(ecclesia::ResourceEntity tag) { | |
| entity_tag_ = tag; | |
| } | |
| void RedfishEntityTrieNode::SetNodeIndexInPatternArray(std::size_t index) { | |
| node_index_in_pattern_array_ = index; | |
| } | |
| std::size_t RedfishEntityTrieNode::GetNodeIndexInPatternArray() const { | |
| return node_index_in_pattern_array_; | |
| } | |
| bool RedfishEntityTrieNode::IsWildcard(absl::string_view path) { | |
| return !path.empty() && path.front() == '{'; | |
| } | |
| } // namespace milotic::authz::internal |