// Copyright 2017-2020 The Verible Authors.
//
// 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.

// -*- c++ -*-
// Some filesystem utilities.
#ifndef VERIBLE_COMMON_UTIL_FILE_UTIL_H_
#define VERIBLE_COMMON_UTIL_FILE_UTIL_H_

#include <string>

#include "absl/status/status.h"
#include "absl/strings/string_view.h"

namespace verible {
namespace file {
// Returns the part of the path after the final "/".  If there is no
// "/" in the path, the result is the same as the input.
// Note that this function's behavior differs from the Unix basename
// command if path ends with "/". For such paths, this function returns the
// empty string.
absl::string_view Basename(absl::string_view filename);

// Returns the part of the basename of path prior to the final ".".  If
// there is no "." in the basename, this is equivalent to file::Basename(path).
absl::string_view Stem(absl::string_view filename);

// Search for 'filename' file starting at 'start' (can be file or directory)
// and going upwards the directory tree. Returns true if anything is found and
// puts the found file in 'result'.
absl::Status UpwardFileSearch(absl::string_view start,
                              absl::string_view filename, std::string* result);

// Read file "filename" and store its content in "content"
absl::Status GetContents(absl::string_view filename, std::string *content);

// Create file "filename" and store given content in it.
absl::Status SetContents(absl::string_view filename, absl::string_view content);

// Join directory + filename
std::string JoinPath(absl::string_view base, absl::string_view name);

// Create directory with given name, return success.
absl::Status CreateDir(absl::string_view dir);

namespace testing {
// Useful for testing: a temporary file that is pre-populated with a particular
// content. File is deleted when instance goes out of scope.
class ScopedTestFile {
 public:
  // Initialize a new file in directory "base_dir" with given "content".
  ScopedTestFile(absl::string_view base_dir, absl::string_view content);
  ~ScopedTestFile();

  // Filename created by this instance.
  absl::string_view filename() const { return filename_; }

 private:
  const std::string filename_;
};
}  // namespace testing
}  // namespace file
}  // namespace verible
#endif  // VERIBLE_COMMON_UTIL_FILE_UTIL_H_
