aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/PackageSpec.cpp
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-08-20 19:09:39 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-08-20 19:09:39 -0700
commitbd222504abea410d77487e176649ae9b6989c4e0 (patch)
tree11eaca74aa69437ca4ac652bf2799d1d39b6d67e /toolsrc/src/PackageSpec.cpp
parentf219ce0b8c3e84e5fc1df21ad2f2c8b13f0fe413 (diff)
downloadvcpkg-bd222504abea410d77487e176649ae9b6989c4e0.tar.gz
vcpkg-bd222504abea410d77487e176649ae9b6989c4e0.zip
[vcpkg] Refactor parsing together and flatten featurespec usages
Diffstat (limited to 'toolsrc/src/PackageSpec.cpp')
-rw-r--r--toolsrc/src/PackageSpec.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/toolsrc/src/PackageSpec.cpp b/toolsrc/src/PackageSpec.cpp
index 475b3e3f6..a5d40e998 100644
--- a/toolsrc/src/PackageSpec.cpp
+++ b/toolsrc/src/PackageSpec.cpp
@@ -13,6 +13,48 @@ namespace vcpkg
return (c == '-') || isdigit(c) || (isalpha(c) && islower(c)) || (c == '[') || (c == ']');
}
+ std::vector<FeatureSpec> FeatureSpec::from_strings_and_triplet(const std::vector<std::string>& depends,
+ const Triplet& triplet)
+ {
+ std::vector<FeatureSpec> f_specs;
+ for (auto&& depend : depends)
+ {
+ auto maybe_spec = ParsedSpecifier::from_string(depend);
+ if (auto spec = maybe_spec.get())
+ {
+ Checks::check_exit(VCPKG_LINE_INFO,
+ spec->triplet.empty(),
+ "error: triplets cannot currently be specified in this context: %s",
+ depend);
+ PackageSpec pspec =
+ PackageSpec::from_name_and_triplet(spec->name, triplet).value_or_exit(VCPKG_LINE_INFO);
+
+ for (auto&& feature : spec->features)
+ f_specs.push_back(FeatureSpec{pspec, feature});
+
+ if (spec->features.empty()) f_specs.push_back(FeatureSpec{pspec, ""});
+ }
+ else
+ {
+ Checks::exit_with_message(
+ VCPKG_LINE_INFO, "error while parsing feature list: %s: %s", to_string(maybe_spec.error()), depend);
+ }
+ }
+ return f_specs;
+ }
+
+ std::vector<FeatureSpec> FullPackageSpec::to_feature_specs(const std::vector<FullPackageSpec>& specs)
+ {
+ std::vector<FeatureSpec> ret;
+ for (auto&& spec : specs)
+ {
+ ret.emplace_back(spec.package_spec, "");
+ for (auto&& feature : spec.features)
+ ret.emplace_back(spec.package_spec, feature);
+ }
+ return ret;
+ }
+
ExpectedT<FullPackageSpec, PackageSpecParseResult> FullPackageSpec::from_string(const std::string& spec_as_string,
const Triplet& default_triplet)
{