From ea0d3220db995018335c48eb06b9794235ff436b Mon Sep 17 00:00:00 2001 From: MetroWind Date: Sun, 7 Sep 2025 09:42:33 -0700 Subject: Initial commit, mostly just copied from shrt. --- src/config.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/config.cpp (limited to 'src/config.cpp') diff --git a/src/config.cpp b/src/config.cpp new file mode 100644 index 0000000..aec29a4 --- /dev/null +++ b/src/config.cpp @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "config.hpp" + +namespace { + +mw::E> readFile(const std::filesystem::path& path) +{ + std::ifstream f(path, std::ios::binary); + std::vector content; + content.reserve(102400); + content.assign(std::istreambuf_iterator(f), + std::istreambuf_iterator()); + if(f.bad() || f.fail()) + { + return std::unexpected(mw::runtimeError( + std::format("Failed to read file {}", path.string()))); + } + + return content; +} + +} // namespace + +mw::E Configuration::fromYaml(const std::filesystem::path& path) +{ + auto buffer = readFile(path); + if(!buffer.has_value()) + { + return std::unexpected(buffer.error()); + } + + ryml::Tree tree = ryml::parse_in_place(ryml::to_substr(*buffer)); + Configuration config; + if(tree["listen-address"].readable()) + { + tree["listen-address"] >> config.listen_address; + } + if(tree["listen-port"].readable()) + { + tree["listen-port"] >> config.listen_port; + } + if(tree["socket-user"].readable()) + { + tree["socket-user"] >> config.socket_user; + } + if(tree["socket-group"].readable()) + { + tree["socket-group"] >> config.socket_group; + } + if(tree["socket-permission"].readable()) + { + tree["socket-permission"] >> config.socket_permission; + } + if(tree["base-url"].readable()) + { + tree["base-url"] >> config.base_url; + } + if(tree["data-dir"].readable()) + { + tree["data-dir"] >> config.data_dir; + } + if(tree["openid-url-prefix"].readable()) + { + tree["openid-url-prefix"] >> config.openid_url_prefix; + } + if(tree["client-id"].readable()) + { + tree["client-id"] >> config.client_id; + } + if(tree["client-secret"].readable()) + { + tree["client-secret"] >> config.client_secret; + } + + return mw::E{std::in_place, std::move(config)}; +} -- cgit v1.2.3-70-g09d2