Atlas-Launcher/source/script/module/filesystem/Path.hpp

115 lines
3.1 KiB
C++

#pragma once
#include <filesystem>
#include <vector>
#include "File.hpp"
#include "script/engine/Engine.hpp"
#include "utils/angelscript/MixinAsReferenceCount.hpp"
/**
* Represent a virtual file system path in the Atlas engine
* Similar to the pathlib library in Python
*/
class Path : public atlas::utils::angelscript::MixinAsReferenceCount {
public:
explicit Path(const vfs::VirtualFileSystem* fileSystem, const std::filesystem::path& virtualPath);
// browse
/**
* Get the parent directory
* @return the parent directory
*/
[[nodiscard]] Path getParent() const;
/**
* Get the child paths
* @return the child paths
*/
[[nodiscard]] std::vector<Path> getChildrens(bool recursive = false, const std::string& pattern = "*") const;
// type
/**
* Check if the path correspond to a file system entry
* @return does the path exists
*/
[[nodiscard]] bool exists() const;
/**
* is the current path leading to a file
* @return is the current path leading to a file
*/
[[nodiscard]] bool isFile() const;
/**
* is the current path leading to a directory
* @return is the current path leading to a directory
*/
[[nodiscard]] bool isDirectory() const;
// operation
/**
* open the path as a file
* @return the opened file
*/
[[nodiscard]] File* open(const std::string& mode, const std::string& encoding = "utf-8") const;
[[nodiscard]] bool mkdir(bool parents) const;
void remove(bool recursive) const;
// component
/**
* get the full path to the file
* @return the full path to the file
*/
[[nodiscard]] std::string getPath() const;
/**
* get the name of the directory containing the file
* @return the name of the directory containing the file
*/
[[nodiscard]] std::string getDirname() const;
/**
* get the name of the file
* @return the name of the file
*/
[[nodiscard]] std::string getFilename() const;
/**
* get the name of the file without the suffix
* @return the name of the file without the suffix
*/
[[nodiscard]] std::string getBasename() const;
/**
* get the extension of the file
* @return the extension of the file
*/
[[nodiscard]] std::string getSuffix() const;
/**
* get the extensions of the file
* @return the extensions of the file
*/
[[nodiscard]] std::vector<std::string> getSuffixes() const;
/**
* get the components of the path
* @return the components of the path
*/
[[nodiscard]] std::vector<std::string> getComponents() const;
private:
/// the JavaScript engine
const vfs::VirtualFileSystem* fileSystem;
/// the virtual path
std::filesystem::path virtualPath;
/**
* Get the real path on the host file system of the path
* @return the real path on the host file system
* @throw rvfs::exception::FileNotFoundException if the path does not match with anything on the real file system
*/
[[nodiscard]] std::filesystem::path getRealPath() const;
};