blob: 0e413580fb971288d75f3e511d3718ecc8d3d820 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#include "opendal_async.hpp"
#include <iterator>
#include "async.rs.h"
#include "async_defs.hpp"
#define RUST_STR(s) rust::Str(s.data(), s.size())
#define RUST_STRING(s) rust::String(s.data(), s.size())
using namespace opendal::async;
static rust::Box<opendal::ffi::async_op::Operator> new_operator(
std::string_view scheme,
const std::unordered_map<std::string, std::string> &config) {
auto rust_map = rust::Vec<opendal::ffi::async_op::HashMapValue>();
rust_map.reserve(config.size());
for (auto &[k, v] : config) {
rust_map.push_back({RUST_STRING(k), RUST_STRING(v)});
}
return opendal::ffi::async_op::new_operator(RUST_STR(scheme), rust_map);
}
Operator::Operator(std::string_view scheme,
const std::unordered_map<std::string, std::string> &config)
: operator_(new_operator(scheme, config)) {}
Operator::ReadFuture Operator::Read(std::string_view path) {
return opendal::ffi::async_op::operator_read(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path));
}
Operator::WriteFuture Operator::Write(std::string_view path,
std::span<uint8_t> data) {
rust::Vec<uint8_t> vec;
std::copy(data.begin(), data.end(), std::back_inserter(vec));
return opendal::ffi::async_op::operator_write(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path), vec);
}
Operator::ListFuture Operator::List(std::string_view path) {
return opendal::ffi::async_op::operator_list(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path));
}
Operator::ExistsFuture Operator::Exists(std::string_view path) {
return opendal::ffi::async_op::operator_exists(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path));
}
Operator::CreateDirFuture Operator::CreateDir(std::string_view path) {
return opendal::ffi::async_op::operator_create_dir(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path));
}
Operator::CopyFuture Operator::Copy(std::string_view from,
std::string_view to) {
return opendal::ffi::async_op::operator_copy(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(from),
RUST_STRING(to));
}
Operator::RenameFuture Operator::Rename(std::string_view from,
std::string_view to) {
return opendal::ffi::async_op::operator_rename(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(from),
RUST_STRING(to));
}
Operator::DeleteFuture Operator::DeletePath(std::string_view path) {
return opendal::ffi::async_op::operator_delete(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path));
}
Operator::ReaderFuture Operator::GetReader(std::string_view path) {
return opendal::ffi::async_op::operator_reader(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path));
}
Operator::ListerFuture Operator::GetLister(std::string_view path) {
return opendal::ffi::async_op::operator_lister(
opendal::ffi::async_op::OperatorPtr{&*operator_}, RUST_STRING(path));
}
// Reader implementation
Reader::Reader(size_t reader_id) noexcept : reader_id_(reader_id) {}
Reader::Reader(Reader &&other) noexcept : reader_id_(other.reader_id_) {
other.reader_id_ = 0;
}
Reader &Reader::operator=(Reader &&other) noexcept {
if (this != &other) {
reader_id_ = other.reader_id_;
other.reader_id_ = 0;
}
return *this;
}
Reader::~Reader() noexcept { Destroy(); }
void Reader::Destroy() noexcept {
if (reader_id_ != 0) {
opendal::ffi::async_op::delete_reader(
opendal::ffi::async_op::ReaderPtr{reader_id_});
reader_id_ = 0;
}
}
Reader::ReadFuture Reader::Read(uint64_t start, uint64_t len) {
return opendal::ffi::async_op::reader_read(
opendal::ffi::async_op::ReaderPtr{reader_id_}, start, len);
}
// Lister implementation
Lister::Lister(size_t lister_id) noexcept : lister_id_(lister_id) {}
Lister::Lister(Lister &&other) noexcept : lister_id_(other.lister_id_) {
other.lister_id_ = 0;
}
Lister &Lister::operator=(Lister &&other) noexcept {
if (this != &other) {
lister_id_ = other.lister_id_;
other.lister_id_ = 0;
}
return *this;
}
Lister::~Lister() noexcept { Destroy(); }
void Lister::Destroy() noexcept {
if (lister_id_ != 0) {
opendal::ffi::async_op::delete_lister(
opendal::ffi::async_op::ListerPtr{lister_id_});
lister_id_ = 0;
}
}
Lister::NextFuture Lister::Next() {
return opendal::ffi::async_op::lister_next(
opendal::ffi::async_op::ListerPtr{lister_id_});
}