| 
							- #include "./library.hpp"
 - 
 - #include <libman/parse.hpp>
 - 
 - #include <spdlog/spdlog.h>
 - 
 - using namespace lm;
 - 
 - library library::from_file(path_ref fpath) {
 -     auto pairs = parse_file(fpath);
 - 
 -     library ret;
 - 
 -     std::vector<std::string> uses_strs;
 -     std::vector<std::string> links_strs;
 - 
 -     std::string _type_;
 -     read(fmt::format("Reading library manifest file '{}'", fpath.string()),
 -          pairs,
 -          read_required("Type", _type_),
 -          read_check_eq("Type", "Library"),
 -          read_required("Name", ret.name),
 -          read_opt("Path", ret.linkable_path),
 -          read_accumulate("Include-Path", ret.include_paths),
 -          read_accumulate("Preprocessor-Define", ret.preproc_defs),
 -          read_accumulate("Uses", uses_strs),
 -          read_accumulate("Links", links_strs),
 -          read_accumulate("Special-Uses", ret.special_uses));
 - 
 -     for (auto&& uses_str : uses_strs) {
 -         ret.uses.push_back(split_usage_string(uses_str));
 -     }
 - 
 -     for (auto&& links_str : links_strs) {
 -         ret.links.push_back(split_usage_string(links_str));
 -     }
 - 
 -     auto make_absolute = [&](path_ref p) { return fpath.parent_path() / p; };
 -     std::transform(ret.include_paths.begin(),
 -                    ret.include_paths.end(),
 -                    ret.include_paths.begin(),
 -                    make_absolute);
 - 
 -     if (ret.linkable_path) {
 -         ret.linkable_path = make_absolute(*ret.linkable_path);
 -     }
 - 
 -     return ret;
 - }
 - 
 - usage lm::split_usage_string(std::string_view str) {
 -     auto sl_pos = str.find('/');
 -     if (sl_pos == str.npos) {
 -         throw std::runtime_error("Invalid Uses/Links specifier: " + std::string(str));
 -     }
 -     auto ns   = str.substr(0, sl_pos);
 -     auto name = str.substr(sl_pos + 1);
 -     return usage{std::string(ns), std::string(name)};
 - }
 
 
  |