aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/StatusParagraph.cpp
diff options
context:
space:
mode:
authorAlexander Karatarakis <alkarata@microsoft.com>2016-09-18 20:50:08 -0700
committerAlexander Karatarakis <alkarata@microsoft.com>2016-09-18 20:54:03 -0700
commitccca198c1b1730b0241911cb56dc8e3504958b2a (patch)
treea2dd9b8b087a09afdcecc5cbb3377bed15127eb2 /toolsrc/src/StatusParagraph.cpp
downloadvcpkg-ccca198c1b1730b0241911cb56dc8e3504958b2a.tar.gz
vcpkg-ccca198c1b1730b0241911cb56dc8e3504958b2a.zip
Initial commit
Diffstat (limited to 'toolsrc/src/StatusParagraph.cpp')
-rw-r--r--toolsrc/src/StatusParagraph.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/toolsrc/src/StatusParagraph.cpp b/toolsrc/src/StatusParagraph.cpp
new file mode 100644
index 000000000..09a3b4d45
--- /dev/null
+++ b/toolsrc/src/StatusParagraph.cpp
@@ -0,0 +1,87 @@
+#include "StatusParagraph.h"
+#include "vcpkglib_helpers.h"
+
+using namespace vcpkg::details;
+
+namespace vcpkg
+{
+ StatusParagraph::StatusParagraph() : want(want_t::error), state(install_state_t::error)
+ {
+ }
+
+ std::ostream& operator<<(std::ostream& os, const StatusParagraph& p)
+ {
+ os << p.package;
+ os << "Status: " << to_string(p.want) << " ok " << to_string(p.state) << "\n";
+ return os;
+ }
+
+ StatusParagraph::StatusParagraph(const std::unordered_map<std::string, std::string>& fields)
+ : package(fields)
+ {
+ std::string status_field;
+ required_field(fields, status_field, "Status");
+
+ auto b = status_field.begin();
+ auto mark = b;
+ auto e = status_field.end();
+
+ // Todo: improve error handling
+ while (b != e && *b != ' ')
+ ++b;
+
+ want = [](const std::string& text)
+ {
+ if (text == "unknown")
+ return want_t::unknown;
+ if (text == "install")
+ return want_t::install;
+ if (text == "hold")
+ return want_t::hold;
+ if (text == "deinstall")
+ return want_t::deinstall;
+ if (text == "purge")
+ return want_t::purge;
+ return want_t::error;
+ }(std::string(mark, b));
+
+ if (std::distance(b, e) < 4)
+ return;
+ b += 4;
+
+ state = [](const std::string& text)
+ {
+ if (text == "not-installed")
+ return install_state_t::not_installed;
+ if (text == "installed")
+ return install_state_t::installed;
+ if (text == "half-installed")
+ return install_state_t::half_installed;
+ return install_state_t::error;
+ }(std::string(b, e));
+ }
+
+ std::string to_string(install_state_t f)
+ {
+ switch (f)
+ {
+ case install_state_t::half_installed: return "half-installed";
+ case install_state_t::installed: return "installed";
+ case install_state_t::not_installed: return "not-installed";
+ default: return "error";
+ }
+ }
+
+ std::string to_string(want_t f)
+ {
+ switch (f)
+ {
+ case want_t::deinstall: return "deinstall";
+ case want_t::hold: return "hold";
+ case want_t::install: return "install";
+ case want_t::purge: return "purge";
+ case want_t::unknown: return "unknown";
+ default: return "error";
+ }
+ }
+}