// docker-finance | modern accounting for the power-user // // Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . //! \file //! \author Aaron Fiore (Founder, Evergreen Crypto LLC) //! \note File intended to be loaded into ROOT.cern framework / Cling interpreter //! \since docker-finance 1.0.0 #ifndef CONTAINER_SRC_ROOT_MACRO_COMMON_UTILITY_HH_ #define CONTAINER_SRC_ROOT_MACRO_COMMON_UTILITY_HH_ #include #include #include #include #include //! \namespace docker_finance //! \since docker-finance 1.0.0 namespace docker_finance { //! \namespace docker_finance::macro //! \brief ROOT macros //! \since docker-finance 1.0.0 namespace macro { //! \namespace docker_finance::macro::common //! \brief Shared ROOT macro-related functionality //! \since docker-finance 1.0.0 namespace common { //! \brief Wrapper to ROOT Cling commands //! \ingroup cpp_macro_impl //! \since docker-finance 1.0.0 class Command final { public: Command() = default; ~Command() = default; Command(const Command&) = default; Command& operator=(const Command&) = default; Command(Command&&) = default; Command& operator=(Command&&) = default; private: static void cmd_handler(const std::initializer_list& command) { for (const auto& cmd : command) { std::cout << "Interpreting: '" << cmd << "'" << std::endl; gInterpreter->ProcessLine(cmd.c_str()); } } public: //! \brief Load given file path static void load(const std::string& path) { std::string cmd{".L ./" + path}; Command::cmd_handler({cmd}); } //! \brief Load given file paths static void load(const std::initializer_list& commands) { for (const auto& cmd : commands) Command::load(cmd); } }; //! \brief Get ROOT environment variable //! \param var ROOT variable //! \note ROOT environment variables include shell (and shell caller) environment //! \since docker-finance 1.0.0 std::string get_env(const std::string& var) { const auto* env = gSystem->Getenv(var.c_str()); if (!env) throw std::runtime_error( std::string{var + " is not set or is unavailable"}.c_str()); return std::string{env}; } //! \brief Make current timestamp //! \return timestamp in "yyyy-mm-ddThh:mm:ssZ" format //! \since docker-finance 1.0.0 std::string make_timestamp() { const std::time_t t{std::time({})}; std::vector time(std::size("yyyy-mm-ddThh:mm:ssZ")); std::strftime(time.data(), time.size(), "%FT%TZ", std::gmtime(&t)); return std::string{time.data()}; } } // namespace common //! \brief Load file by path //! \ingroup cpp_macro //! \details //! Example: //!
  root [0] docker_finance::macro::load("test/test.C")
//! //! Will load: //!
  root/macro/test/test.C
//! //! \note Parent directory is `root/macro` void load(const std::string& path) { common::Command::load(path); } //! \brief Wrapper to load files by list of paths //! \ingroup cpp_macro //! \details //! Example: //!
  root [0] docker_finance::macro::load({"test/test.C", "../src/hash.hh"})
//! //! Will load: //!
  root/macro/test/test.C and root/src/hash.hh
//! //! \note Parent directory is `root/macro` void load(const std::initializer_list& paths) { for (const auto& path : paths) common::Command::load(path); } } // namespace macro } // namespace docker_finance #endif // CONTAINER_SRC_ROOT_MACRO_COMMON_UTILITY_HH_ // # vim: sw=2 sts=2 si ai et