diff options
| author | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-11-01 17:06:45 +0100 |
|---|---|---|
| committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-11-01 17:06:45 +0100 |
| commit | 5c1d7018ba867a73c160cc044b939e35a2c07243 (patch) | |
| tree | cfd87d1b2f76eec9584bd3a418a1abeee95c37fe | |
| parent | e9df22c4d873852f441d5f9e968d90b7c4adae23 (diff) | |
| download | forstio-forstio-5c1d7018ba867a73c160cc044b939e35a2c07243.tar.gz | |
Added an easy feature for writing and reading files
| -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; +} + +} +} |
