summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2025-11-06 15:13:49 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2025-11-06 15:13:49 +0100
commitf32687ccab6158e9611007e6fc2d66bf4751e111 (patch)
tree3a66c1af5a28627daa6cead6db2148d7073ff0f5
parente0bbafdc39d13209a5e09a7be3c4fe30185b6b80 (diff)
downloadapps-science_tools-f32687ccab6158e9611007e6fc2d66bf4751e111.tar.gz
Adding the writing
-rw-r--r--run_and_record/.nix/derivation.nix3
-rw-r--r--run_and_record/SConstruct3
-rw-r--r--run_and_record/c++/file.hpp78
-rw-r--r--run_and_record/c++/main.cpp43
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();
}
}