blob: 95fe41541028d3a9493de313de0d94b4e59535ee [file] [log] [blame]
/*
* Copyright 2019 Google Inc.
* 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
*
* https://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 INTERNAL_UTIL_FILE_H_
#define INTERNAL_UTIL_FILE_H_
#include <string>
#include "util/status.inc"
namespace private_join_and_compute {
// Renames a file. Overwrites the new file if it exists.
// Returns Status::OK for success.
// Error code in case of an error depends on the underlying implementation.
Status RenameFile(absl::string_view from, absl::string_view to);
// Deletes a file.
// Returns Status::OK for success.
// Error code in case of an error depends on the underlying implementation.
Status DeleteFile(absl::string_view file_name);
class File {
public:
virtual ~File() = default;
// Opens the file_name for file operations applicable based on mode.
// Returns Status::OK for success.
// Error code in case of an error depends on the underlying implementation.
virtual Status Open(absl::string_view file_name, absl::string_view mode) = 0;
// Closes the opened file. Must be called after opening a file.
// Returns Status::OK for success.
// Error code in case of an error depends on the underlying implementation.
virtual Status Close() = 0;
// Returns true if there are more data in the file to be read.
// Returns a status instead in case of an io error in determining if there is
// more data.
virtual StatusOr<bool> HasMore() = 0;
// Returns a data string of size length from reading file if successful.
// Returns a status in case of an error.
// This would also return an error status if the read data size is less than
// the length since it indicates file corruption.
virtual StatusOr<std::string> Read(size_t length) = 0;
// Returns a line as string from the file without the trailing '\n' (or "\r\n"
// in the case of Windows).
//
// Returns a status in case of an error.
virtual StatusOr<std::string> ReadLine() = 0;
// Writes the given content of size length into the file.
// Error code in case of an error depends on the underlying implementation.
virtual Status Write(absl::string_view content, size_t length) = 0;
// Returns a File object depending on the linked implementation.
// Caller takes the ownership.
static File* GetFile();
protected:
File() = default;
};
namespace internal {
std::string JoinPathImpl(std::initializer_list<std::string> paths);
} // namespace internal
// Joins multiple paths together such that only the first argument directory
// structure is represented. A dot as a separator is added for other arguments.
//
// Arguments | JoinPath |
// ---------------------------+---------------------+
// '/foo', 'bar' | /foo/bar |
// '/foo/', 'bar' | /foo/bar |
// '/foo', '/bar' | /foo/bar |
// '/foo', '/bar', '/baz' | /foo/bar.baz |
//
// All paths will be treated as relative paths, regardless of whether or not
// they start with a leading '/'. That is, all paths will be concatenated
// together, with the appropriate path separator inserted in between.
// After the first path, all paths will be joined with a dot instead of the path
// separator so that there is no level of directory after the first argument.
// Arguments must be convertible to string.
//
// Usage:
// string path = file::JoinPath("/tmp", dirname, filename);
template <typename... T>
std::string JoinPath(const T&... args) {
return internal::JoinPathImpl({args...});
}
} // namespace private_join_and_compute
#endif // INTERNAL_UTIL_FILE_H_