#pragma once
#include <cassert>
#include <fcntl.h>
#include <memory>
#include <string_view>
#include <variant>
#include "file.h"
namespace wasmfs::path {
using Error = long;
using ParentChild = std::pair<std::shared_ptr<Directory>, std::string_view>;
enum LinkBehavior { FollowLinks, NoFollowLinks };
struct ParsedParent {
private:
std::variant<Error, ParentChild> val;
public:
ParsedParent(Error err) : val(err) {}
ParsedParent(ParentChild pair) : val(pair) {}
long getError() {
if (auto* err = std::get_if<Error>(&val)) {
assert(*err != 0 && "Unexpected zero error value");
return *err;
}
return 0;
}
ParentChild& getParentChild() {
auto* ptr = std::get_if<ParentChild>(&val);
assert(ptr && "Unhandled path parsing error!");
return *ptr;
}
};
ParsedParent parseParent(std::string_view path, __wasi_fd_t basefd = AT_FDCWD);
struct ParsedFile {
private:
std::variant<Error, std::shared_ptr<File>> val;
public:
ParsedFile(Error err) : val(err) {}
ParsedFile(std::shared_ptr<File> file) : val(std::move(file)) {}
long getError() {
if (auto* err = std::get_if<Error>(&val)) {
assert(*err != 0 && "Unexpected zero error value");
return *err;
}
return 0;
}
std::shared_ptr<File>& getFile() {
auto* ptr = std::get_if<std::shared_ptr<File>>(&val);
return *ptr;
}
};
ParsedFile parseFile(std::string_view path,
__wasi_fd_t basefd = AT_FDCWD,
LinkBehavior links = FollowLinks);
ParsedFile getFileAt(__wasi_fd_t fd, std::string_view path, int flags);
ParsedFile getFileFrom(std::shared_ptr<Directory> base, std::string_view path);
}