#include "util.hh" #include "outputs-spec.hh" #include "nlohmann/json.hpp" #include namespace nix { std::pair ExtendedOutputsSpec::parse(std::string s) { static std::regex regex(R"((.*)\^((\*)|([a-z]+(,[a-z]+)*)))"); std::smatch match; if (!std::regex_match(s, match, regex)) return {s, DefaultOutputs()}; if (match[3].matched) return {match[1], AllOutputs()}; return {match[1], tokenizeString(match[4].str(), ",")}; } std::string ExtendedOutputsSpec::to_string() const { return std::visit(overloaded { [&](const ExtendedOutputsSpec::Default &) -> std::string { return ""; }, [&](const ExtendedOutputsSpec::All &) -> std::string { return "*"; }, [&](const ExtendedOutputsSpec::Names & outputNames) -> std::string { return "^" + concatStringsSep(",", outputNames); }, }, raw()); } void to_json(nlohmann::json & json, const ExtendedOutputsSpec & extendedOutputsSpec) { if (std::get_if(&extendedOutputsSpec)) json = nullptr; else if (std::get_if(&extendedOutputsSpec)) json = std::vector({"*"}); else if (auto outputNames = std::get_if(&extendedOutputsSpec)) json = *outputNames; } void from_json(const nlohmann::json & json, ExtendedOutputsSpec & extendedOutputsSpec) { if (json.is_null()) extendedOutputsSpec = DefaultOutputs(); else { auto names = json.get(); if (names == OutputNames({"*"})) extendedOutputsSpec = AllOutputs(); else extendedOutputsSpec = names; } } }