summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2025-11-01 17:06:45 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2025-11-01 17:06:45 +0100
commit5c1d7018ba867a73c160cc044b939e35a2c07243 (patch)
treecfd87d1b2f76eec9584bd3a418a1abeee95c37fe /modules
parente9df22c4d873852f441d5f9e968d90b7c4adae23 (diff)
downloadforstio-forstio-5c1d7018ba867a73c160cc044b939e35a2c07243.tar.gz
Added an easy feature for writing and reading files
Diffstat (limited to 'modules')
-rw-r--r--modules/remote-filesystem/c++/easy.hpp78
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;
+}
+
+}
+}