aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/PackageSpec.cpp
diff options
context:
space:
mode:
authorDaniel Shaw <t-dansha@microsoft.com>2017-07-19 14:29:28 -0700
committerDaniel Shaw <t-dansha@microsoft.com>2017-07-24 15:21:32 -0700
commit59389ca236b005922cf1101f66c957d2396f6371 (patch)
tree42bbcc25b501967203c63dd55b665ec9f49a41e4 /toolsrc/src/PackageSpec.cpp
parent1445115906139f5c6d14bcbbacdcc0cfb543fd80 (diff)
downloadvcpkg-59389ca236b005922cf1101f66c957d2396f6371.tar.gz
vcpkg-59389ca236b005922cf1101f66c957d2396f6371.zip
end to end feature pkg draft
Diffstat (limited to 'toolsrc/src/PackageSpec.cpp')
-rw-r--r--toolsrc/src/PackageSpec.cpp47
1 files changed, 39 insertions, 8 deletions
diff --git a/toolsrc/src/PackageSpec.cpp b/toolsrc/src/PackageSpec.cpp
index 12217ac98..a7e5648cd 100644
--- a/toolsrc/src/PackageSpec.cpp
+++ b/toolsrc/src/PackageSpec.cpp
@@ -10,13 +10,47 @@ namespace vcpkg
return (c == '-') || isdigit(c) || (isalpha(c) && islower(c)) || (c == '[') || (c == ']');
}
- ExpectedT<PackageSpec, PackageSpecParseResult> PackageSpec::from_string(const std::string& spec_as_string,
- const Triplet& default_triplet)
+ ExpectedT<FullPackageSpec, PackageSpecParseResult> FullPackageSpec::from_string(const std::string& spec_as_string,
+ const Triplet& default_triplet)
{
auto pos = spec_as_string.find(':');
- if (pos == std::string::npos)
+ auto pos_l_bracket = spec_as_string.find('[');
+ auto pos_r_bracket = spec_as_string.find(']');
+
+ FullPackageSpec f;
+ if (pos == std::string::npos && pos_l_bracket == std::string::npos)
+ {
+ f.package_spec =
+ PackageSpec::from_name_and_triplet(spec_as_string, default_triplet).value_or_exit(VCPKG_LINE_INFO);
+ return f;
+ }
+ else if (pos == std::string::npos)
+ {
+ if (pos_r_bracket == std::string::npos || pos_l_bracket >= pos_r_bracket)
+ {
+ return PackageSpecParseResult::INVALID_CHARACTERS;
+ }
+ const std::string name = spec_as_string.substr(0, pos_l_bracket);
+ f.package_spec = PackageSpec::from_name_and_triplet(name, default_triplet).value_or_exit(VCPKG_LINE_INFO);
+ f.features = parse_comma_list(spec_as_string.substr(pos_l_bracket + 1, pos_r_bracket - pos_l_bracket - 1));
+ return f;
+ }
+ else if (pos_l_bracket == std::string::npos && pos_r_bracket == std::string::npos)
+ {
+ const std::string name = spec_as_string.substr(0, pos);
+ const Triplet triplet = Triplet::from_canonical_name(spec_as_string.substr(pos + 1));
+ f.package_spec = PackageSpec::from_name_and_triplet(name, triplet).value_or_exit(VCPKG_LINE_INFO);
+ }
+ else
{
- return from_name_and_triplet(spec_as_string, default_triplet);
+ if (pos_r_bracket == std::string::npos || pos_l_bracket >= pos_r_bracket)
+ {
+ return PackageSpecParseResult::INVALID_CHARACTERS;
+ }
+ const std::string name = spec_as_string.substr(0, pos_l_bracket);
+ f.features = parse_comma_list(spec_as_string.substr(pos_l_bracket + 1, pos_r_bracket - pos_l_bracket - 1));
+ const Triplet triplet = Triplet::from_canonical_name(spec_as_string.substr(pos + 1));
+ f.package_spec = PackageSpec::from_name_and_triplet(name, triplet).value_or_exit(VCPKG_LINE_INFO);
}
auto pos2 = spec_as_string.find(':', pos + 1);
@@ -24,10 +58,7 @@ namespace vcpkg
{
return PackageSpecParseResult::TOO_MANY_COLONS;
}
-
- const std::string name = spec_as_string.substr(0, pos);
- const Triplet triplet = Triplet::from_canonical_name(spec_as_string.substr(pos + 1));
- return from_name_and_triplet(name, triplet);
+ return f;
}
ExpectedT<PackageSpec, PackageSpecParseResult> PackageSpec::from_name_and_triplet(const std::string& name,