| #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 |