/// \file Path.cpp

//
// This file is distributed under the MIT License. See LICENSE.md for details.
//

#include "revng/Storage/Path.h"
#include "revng/Storage/StorageClient.h"

#include "LocalStorageClient.h"
#include "StdStorageClient.h"

namespace {

// TODO: unix-specific, will not work on Windows
revng::LocalStorageClient LocalClient("/");
revng::StdinStorageClient StdinClient;
revng::StdoutStorageClient StdoutClient;

std::string normalizeLocalPath(llvm::StringRef Path) {
  llvm::SmallString<256> PathCopy(Path);
  std::error_code MakeAbsoluteError = llvm::sys::fs::make_absolute(PathCopy);
  revng_assert(not MakeAbsoluteError);
  llvm::sys::path::remove_dots(PathCopy, true);
  llvm::StringRef Result(PathCopy.substr(1)); // Remove leading '/'
  return Result.str();
}

} // namespace

namespace revng {

DirectoryPath DirectoryPath::fromLocalStorage(llvm::StringRef Path) {
  return revng::DirectoryPath{ &LocalClient, normalizeLocalPath(Path) };
}

FilePath FilePath::stdin() {
  return revng::FilePath{ &StdinClient, "" };
}

FilePath FilePath::stdout() {
  return revng::FilePath{ &StdoutClient, "" };
}

FilePath FilePath::fromLocalStorage(llvm::StringRef Path) {
  return revng::FilePath{ &LocalClient, normalizeLocalPath(Path) };
}

} // namespace revng
