blob: b4b0554160f43526c9c09c4b75504f1c047d7fe5 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_FILES_FILE_ERROR_OR_H_
#define BASE_FILES_FILE_ERROR_OR_H_
#include <utility>
#include "base/check.h"
#include "base/files/file.h"
#include "base/types/expected.h"
namespace base {
// Helper for methods which perform file system operations and which may fail.
// Objects of this type can take on EITHER a base::File::Error value OR a result
// value of the specified type.
template <typename ValueType>
class FileErrorOr {
public:
// These constructors are intentionally not marked `explicit` for cleaner code
// at call sites.
FileErrorOr(File::Error error) : value_or_error_(unexpected(error)) {}
FileErrorOr(ValueType&& value) : value_or_error_(std::move(value)) {}
FileErrorOr(const FileErrorOr&) = default;
FileErrorOr(FileErrorOr&&) = default;
FileErrorOr& operator=(const FileErrorOr&) = default;
FileErrorOr& operator=(FileErrorOr&&) = default;
~FileErrorOr() = default;
bool is_error() const { return !value_or_error_.has_value(); }
File::Error error() const { return value_or_error_.error(); }
bool is_value() const { return value_or_error_.has_value(); }
ValueType& value() { return value_or_error_.value(); }
const ValueType& value() const { return value_or_error_.value(); }
ValueType* operator->() { return &value(); }
const ValueType* operator->() const { return &value(); }
private:
expected<ValueType, File::Error> value_or_error_;
};
} // namespace base
#endif // BASE_FILES_FILE_ERROR_OR_H_