diff options
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/remote-filesystem/c++/easy.hpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/modules/remote-filesystem/c++/easy.hpp b/modules/remote-filesystem/c++/easy.hpp new file mode 100644 index 0000000..9fc8af7 --- /dev/null +++ b/modules/remote-filesystem/c++/easy.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include "remote.hpp" + +#include <forstio/error.hpp> + +namespace saw { +namespace easy { +template<typename Sch, typename FileEnc, typename Enc = FORSTIO_DEFAULT_DATA_ENCODING> +error_or<void> encode_and_write_file(const std::filesystem::path& p_, const data<Sch,Enc>& data_){ + data<Sch, FileEnc> dat; + { + codec<Sch, FileEnc> cdc; + auto eov = cdc.encode(data_,dat); + if(eov.is_error()){ + return eov; + } + } + + remote<rmt::File> file_remote; + auto eo_addr = file_remote.parse_address(p_); + if(eo_addr.is_error()){ + return std::move(eo_addr.get_error()); + } + auto& addr = eo_addr.get_value(); + + auto eo_srv = file_remote.template data_listen<Sch,FileEnc>({*addr}); + if(eo_srv.is_error()){ + return std::move(eo_srv.get_error()); + } + auto& srv = eo_srv.get_value(); + id<Sch> fid{0u}; + + auto eo_write = srv->send({fid}, dat); + if(eo_write.is_error()){ + return eo_write; + } + + return make_void(); +} + +template<typename Sch, typename FileEnc, typename Enc = FORSTIO_DEFAULT_DATA_ENCODING> +error_or<data<Sch,Enc>> read_and_decode_file(const std::filesystem::path& p_){ + data<Sch, Enc> dat; + + remote<rmt::File> file_remote; + auto eo_addr = file_remote.parse_address(p_); + if(eo_addr.is_error()){ + return std::move(eo_addr.get_error()); + } + auto& addr = eo_addr.get_value(); + + auto eo_srv = file_remote.template data_listen<Sch,FileEnc>({*addr}); + if(eo_srv.is_error()){ + return std::move(eo_srv.get_error()); + } + auto& srv = eo_srv.get_value(); + id<Sch> fid{0u}; + + auto eo_read = srv->receive({fid}); + if(eo_read.is_error()){ + return eo_read; + } + auto& read = eo_read.get_value(); + + { + codec<Sch, FileEnc> cdc; + auto eov = cdc.decode(read,dat); + if(eov.is_error()){ + return std::move(eov.get_error()); + } + } + + return dat; +} + +} +} |
