aboutsummaryrefslogtreecommitdiff
#include <kapi/filesystem.hpp>

#include <kernel/filesystem/open_file_descriptor.hpp>
#include <kernel/filesystem/open_file_table.hpp>
#include <kernel/filesystem/vfs.hpp>

#include <kstd/memory.hpp>
#include <kstd/result.hpp>
#include <kstd/system_error.hpp>
#include <kstd/units.hpp>

#include <cstddef>
#include <cstdint>
#include <expected>
#include <span>
#include <string_view>

namespace kapi::filesystem
{
  auto mount(std::string_view source, std::string_view target) -> std::expected<void, kstd::error_code>
  {
    return kernel::filesystem::vfs::get().mount(source, target);
  }

  auto umount(std::string_view target) -> std::expected<void, kstd::error_code>
  {
    return kernel::filesystem::vfs::get().unmount(target);
  }

  auto open(std::string_view path) -> std::expected<std::size_t, kstd::error_code>
  {
    return kernel::filesystem::vfs::get().open(path).and_then([](auto dentry) {
      auto open_file_descriptor = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry);
      return kernel::filesystem::open_file_table::get().add_file(open_file_descriptor);
    });
  }

  auto close(size_t file_descriptor) -> std::expected<void, kstd::error_code>
  {
    return kernel::filesystem::open_file_table::get()
        .file(file_descriptor)
        .transform([](auto file) { return file->get_dentry()->absolute_path(); })
        .and_then([](auto path) { return kernel::filesystem::vfs::get().close(path); })
        .and_then([=]() { return kernel::filesystem::open_file_table::get().remove_file(file_descriptor); });
  }

  auto read(size_t file_descriptor, std::span<std::byte> buffer) -> std::expected<kstd::units::bytes, kstd::error_code>
  {
    return kernel::filesystem::open_file_table::get().file(file_descriptor).and_then([=](auto descriptor) {
      return descriptor->read(buffer.data(), kstd::units::bytes{buffer.size()});
    });
  }

  auto write(size_t file_descriptor, std::span<std::byte const> buffer)
      -> std::expected<kstd::units::bytes, kstd::error_code>
  {
    return kernel::filesystem::open_file_table::get().file(file_descriptor).and_then([=](auto descriptor) {
      return descriptor->write(buffer.data(), kstd::units::bytes{buffer.size()});
    });
  }

  auto mkdir(std::string_view path) -> kstd::result<void>
  {
    return kernel::filesystem::vfs::get().mkdir(path);
  }

  auto create(std::string_view path) -> kstd::result<void>
  {
    return kernel::filesystem::vfs::get().create(path);
  }

  auto status(std::string_view path) -> kstd::result<file_status>
  {
    return kernel::filesystem::vfs::get().status(path);
  }

  auto create_device_node(std::string_view path, file_type type, device_number number) -> kstd::result<void>
  {
    return kernel::filesystem::vfs::get().create_device_node(path, static_cast<std::uint32_t>(type), number);
  }

}  // namespace kapi::filesystem