diff options
Diffstat (limited to 'src/inode2filename/inode_result.h')
-rw-r--r-- | src/inode2filename/inode_result.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/inode2filename/inode_result.h b/src/inode2filename/inode_result.h new file mode 100644 index 0000000..df352fb --- /dev/null +++ b/src/inode2filename/inode_result.h @@ -0,0 +1,82 @@ +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef IORAP_SRC_INODE2FILENAME_INODE_RESULT_H_ +#define IORAP_SRC_INODE2FILENAME_INODE_RESULT_H_ + +#include "common/expected.h" +#include "inode2filename/inode.h" +#include "inode2filename/inode_result.h" +#include "inode2filename/system_call.h" + +#include <rxcpp/rx.hpp> + +#include <memory> +#include <optional> +#include <string> +#include <vector> +namespace iorap::inode2filename { + +// Tuple of (Inode -> (Filename|Errno)) +struct InodeResult { + // We set this error when all root directories have been searched and + // yet we still could not find a corresponding filename for the inode under search. + static constexpr int kCouldNotFindFilename = ENOKEY; + + // An initial inode->filename mapping was found, but subsequent verification for it failed. + static constexpr int kVerificationFailed = EKEYEXPIRED; + + // There is always an inode, but sometimes we may fail to resolve the filename. + Inode inode; + // Value: Contains the filename (with a root directory as a prefix). + // Error: Contains the errno, usually one of the above, otherwise some system error. + iorap::expected<std::string /*filename*/, int /*errno*/> data; + + static InodeResult makeSuccess(Inode inode, std::string filename) { + return InodeResult{inode, std::move(filename)}; + } + + static InodeResult makeFailure(Inode inode, int err_no) { + return InodeResult{inode, iorap::unexpected{err_no}}; + } + + constexpr explicit operator bool() const { + return data.has_value(); + } + + constexpr bool operator==(const InodeResult& other) const { + if (inode == other.inode) { + if (data && other.data) { + return *data == *other.data; + } else if (!data && !other.data) { + return data.error() == other.data.error(); + } + // TODO: operator== for expected + } + return false; + } + + constexpr bool operator!=(const InodeResult& other) const { + return !(*this == other); + } + + // Returns a human-readable error message, or 'nullopt' if there was no error. + std::optional<std::string_view> ErrorMessage() const; +}; + +std::ostream& operator<<(std::ostream& os, const InodeResult& result); + +} // namespace iorap::inode2filename + +#endif // IORAP_SRC_INODE2FILENAME_INODE_RESULT_H_
\ No newline at end of file |