From 619def44c1cca9f3cdf63544d5f24f2c7a7d9b77 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Tue, 22 Feb 2022 17:03:21 +0100 Subject: Initial self-hosting commit This is the initial version of our tool that is able to build itself. In can be bootstrapped by ./bin/bootstrap.py Co-authored-by: Oliver Reiche Co-authored-by: Victor Moreno --- src/buildtool/file_system/jsonfs.hpp | 47 ++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/buildtool/file_system/jsonfs.hpp (limited to 'src/buildtool/file_system/jsonfs.hpp') diff --git a/src/buildtool/file_system/jsonfs.hpp b/src/buildtool/file_system/jsonfs.hpp new file mode 100644 index 00000000..0ec381c7 --- /dev/null +++ b/src/buildtool/file_system/jsonfs.hpp @@ -0,0 +1,47 @@ +#ifndef INCLUDED_SRC_BUILDTOOL_FILE_SYSTEM_JSONFS_HPP +#define INCLUDED_SRC_BUILDTOOL_FILE_SYSTEM_JSONFS_HPP + +#include +#include +#include +#include + +#include "src/buildtool/file_system/file_system_manager.hpp" +#include "src/buildtool/file_system/object_type.hpp" +#include "src/utils/cpp/json.hpp" + +class Json { + public: + // Note that we are not using std::pair and being + // coherent with FileSystemManager::ReadFile because there is a bug in llvm + // toolchain related to type_traits that does not allow us to use + // std::pair where T or U are nlohmann::json. + // LLVM bug report: https://bugs.llvm.org/show_bug.cgi?id=48507 + // Minimal example: https://godbolt.org/z/zacedsGzo + [[nodiscard]] static auto ReadFile( + std::filesystem::path const& file) noexcept + -> std::optional { + auto const type = FileSystemManager::Type(file); + if (not type or not IsFileObject(*type)) { + Logger::Log(LogLevel::Debug, + "{} can not be read because it is not a file.", + file.string()); + return std::nullopt; + } + try { + nlohmann::json content; + std::ifstream file_reader(file.string()); + if (file_reader.is_open()) { + file_reader >> content; + return content; + } + return std::nullopt; + } catch (std::exception const& e) { + Logger::Log(LogLevel::Error, e.what()); + return std::nullopt; + } + } + +}; // Class Json + +#endif // INCLUDED_SRC_BUILDTOOL_FILE_SYSTEM_JSONFS_HPP -- cgit v1.2.3