summaryrefslogtreecommitdiff
path: root/modules/remote-filesystem/c++/remote.hpp
blob: 0225bc5a578b22fa5fb56215486cf8b1f85c93f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#pragma once

#include <filesystem>

#include <forstio/codec/schema_hash.hpp>
#include <forstio/remote/remote.hpp>

namespace saw {
namespace rmt {
struct File {};
}

template<>
class remote_address<rmt::File> {
private:
	std::filesystem::path path_;
public:
	remote_address(const std::filesystem::path& path__):
		path_{path__}
	{}

	std::string get_path_string() const {
		return path_.string();
	}

	const std::filesystem::path& get_path() const {
		return path_;
	}
};

template<>
class remote<rmt::File> {
private:
	SAW_FORBID_COPY(remote);
	SAW_FORBID_MOVE(remote);

	std::map<std::string, ptr<i_data_server<rmt::File>>> registered_data_servers_;
public:
	remote() = default;

	error_or<own<remote_address<rmt::File>>> parse_address(const std::string_view& path_v){
		return heap<remote_address<rmt::File>>(path_v);
	}

	template<typename Schema, typename Encode>
	error_or<own<data_server<Schema, Encode, rmt::File>>> data_listen(ref<remote_address<rmt::File>> addr){
		auto insert_res = registered_data_servers_.emplace(std::make_pair(addr().get_path_string(),ptr<i_data_server<rmt::File>>{}));
		if(!insert_res.second){
			return make_error<err::already_exists>();
		}

		auto dat_srv = heap<data_server<Schema, Encode, rmt::File>>(*this, addr);
		insert_res.first->second = ptr<i_data_server<rmt::File>>{*dat_srv};
		return dat_srv;
	}

	/**
	 * Internal deregister function
	 */
	error_or<void> deregister_data_server(ptr<i_data_server<rmt::File>> srv){
		return make_error<err::not_implemented>();
	}
};
}