diff options
| author | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-11-06 15:13:49 +0100 |
|---|---|---|
| committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-11-06 15:13:49 +0100 |
| commit | f32687ccab6158e9611007e6fc2d66bf4751e111 (patch) | |
| tree | 3a66c1af5a28627daa6cead6db2148d7073ff0f5 | |
| parent | e0bbafdc39d13209a5e09a7be3c4fe30185b6b80 (diff) | |
| download | apps-science_tools-f32687ccab6158e9611007e6fc2d66bf4751e111.tar.gz | |
Adding the writing
| -rw-r--r-- | run_and_record/.nix/derivation.nix | 3 | ||||
| -rw-r--r-- | run_and_record/SConstruct | 3 | ||||
| -rw-r--r-- | run_and_record/c++/file.hpp | 78 | ||||
| -rw-r--r-- | run_and_record/c++/main.cpp | 43 |
4 files changed, 36 insertions, 91 deletions
diff --git a/run_and_record/.nix/derivation.nix b/run_and_record/.nix/derivation.nix index d312b5a..089c7cb 100644 --- a/run_and_record/.nix/derivation.nix +++ b/run_and_record/.nix/derivation.nix @@ -13,8 +13,11 @@ stdenv.mkDerivation { buildInputs = [ forstio.core + forstio.async forstio.codec forstio.codec-json + forstio.remote + forstio.remote-filesystem ]; src = ./..; diff --git a/run_and_record/SConstruct b/run_and_record/SConstruct index d85358b..9dbf18f 100644 --- a/run_and_record/SConstruct +++ b/run_and_record/SConstruct @@ -48,7 +48,8 @@ env=Environment(ENV=os.environ, variables=env_vars, CPPPATH=[], CPPDEFINES=['SAW_UNIX'], CXXFLAGS=['-std=c++20','-g','-Wall','-Wextra'], LIBS=[ - 'forstio-core' + 'forstio-core', + 'forstio-async' ] ) env.__class__.add_source_files = add_kel_source_files diff --git a/run_and_record/c++/file.hpp b/run_and_record/c++/file.hpp deleted file mode 100644 index cb3077f..0000000 --- a/run_and_record/c++/file.hpp +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include <filesystem> -#include <forstio/remote/remote.hpp> - -namespace kel { -namespace sch { -using namespace saw::schema; -} - -template<typename Sch, typename FileEnc, typename Enc = saw::encode::Native> -saw::error_or<void> simple_write_file(const data<Sch,Enc>& data_, const std::filesystem::path& p){ - saw::data<Sch, FileEnc> dat; - { - saw::codec<Sch, FileEnc> cdc; - auto eov = cdc.encode(data_,dat); - if(eov.is_error()){ - return eov; - } - } - - saw::remote<saw::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(); - saw::id<Sch> fid{0u}; - - auto eo_write = srv->send({fid}, dat); - if(eo_write.is_error()){ - return eo_write; - } - - return saw::make_void(); -} - -template<typename Sch, typename FileEnc, typename Enc = saw::encode::Native> -saw::error_or<saw::data<Sch,Enc>> simple_read_file(const std::filesystem::path& p){ - saw::data<Sch, Enc> dat; - - saw::remote<saw::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(); - saw::id<Sch> fid{0u}; - - auto eo_read = srv->receive({fid}); - if(eo_read.is_error()){ - return eo_read; - } - auto& read = eo_read.get_value(); - - { - saw::codec<Sch, FileEnc> cdc; - auto eov = cdc.decode(read,dat); - if(eov.is_error()){ - return std::move(eov.get_error()); - } - } - - return dat; -} -} diff --git a/run_and_record/c++/main.cpp b/run_and_record/c++/main.cpp index 5295a2f..8440d67 100644 --- a/run_and_record/c++/main.cpp +++ b/run_and_record/c++/main.cpp @@ -1,13 +1,14 @@ -#include "file.hpp" - #include <forstio/codec/args.hpp> #include <forstio/codec/json/json.hpp> +#include <forstio/remote/filesystem/easy.hpp> #include <unistd.h> #include <sys/wait.h> #include <iostream> #include <chrono> #include <iomanip> +#include <random> +#include <string_view> namespace kel { namespace sch { @@ -108,11 +109,14 @@ saw::error_or<void> run_program(int argc, char** argv){ return saw::make_void(); } -saw::error_or<std::string> generate_data_dir(const std::string_view& bin_name) { +/** + * + */ +saw::error_or<std::string> generate_data_dir_name(const std::string_view& bin_name) { using namespace std::chrono; auto now = system_clock::now(); auto now_time_t = system_clock::to_time_t(now); - auto now_ms = duration_cast<milliseconds>(no.time_since_epoch()) % 1000u; + auto now_ns = duration_cast<nanoseconds>(now.time_since_epoch()) % (1000000000ul); // Convert to UTC broken-down time std::tm utc_tm{}; @@ -120,9 +124,21 @@ saw::error_or<std::string> generate_data_dir(const std::string_view& bin_name) { std::ostringstream oss; oss << std::put_time(&utc_tm, "%Y-%m-%d-%H-%M-%S-") - << std::setw(3) << std::setfill('0') << ms_part.count() << "-" - << std::setw(9) << std::setfill('0') << ns_part.count() << "-" - << bin_name; + << std::setw(9) << std::setfill('0') << now_ns.count() << "-" + << bin_name << "-"; + + { + constexpr std::string_view chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789"; + + thread_local std::mt19937 generator{std::random_device{}()}; + std::uniform_int_distribution<size_t> distribution(0, chars.size() - 1); + for (size_t i = 0; i < length; ++i){ + oss << chars[distribution(generator)]; + } + } return oss.str(); } @@ -190,18 +206,19 @@ saw::error_or<void> kel_main(int argc, char** argv){ } auto& home = eov.get_value(); - /// @todo Generate unique entry YYYY-MM-DD-HH-SS-MSMS-BIN_NAME-DUMB_HASH ? auto data_dir = home / ".local" / "kel" / "run_and_record"; // - // - auto eo_data_child_dir = generate_data_dir(""); + /// @todo generate bin_name, not just lbm + auto eo_data_child_dir = generate_data_dir_name("lbm"); if(eo_data_child_dir.is_error()){ return std::move(eo_data_child_dir.get_error()); } auto& data_child_dir = eo_data_child_dir.get_value(); + // Don't create the dir yet, but we have the data_dir name now auto data_full_dir = data_dir / data_child_dir; + // Read the user config file for recording { auto conf_file = home / ".config" / "kel" / "run_and_record.json"; auto eo_file = simple_read_file<sch::RarConfig,saw::encode::Json>(conf_file); @@ -239,10 +256,12 @@ saw::error_or<void> kel_main(int argc, char** argv){ } } { + auto eov = easy::write_file<sch::RarFileData, saw::encode::Json>(data_full_dir, data_for_file); + if(eov.is_error()){ + return eov; + } } - - return saw::make_void(); } } |
