config_parser: Add common boolean parser

This more accurately parses systemd values instead of just comparing to
"false" or "true".

Change-Id: I0d70ef418075d555bf6f090fefa0b34332491ed0
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/util.cpp b/src/util.cpp
index de0bc9d..13be8d0 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -367,8 +367,6 @@
 EthernetInterfaceIntf::DHCPConf getDHCPValue(const std::string& confDir,
                                              const std::string& intf)
 {
-    EthernetInterfaceIntf::DHCPConf dhcp =
-        EthernetInterfaceIntf::DHCPConf::none;
     // Get the interface mode value from systemd conf
     // using namespace std::string_literals;
     fs::path confPath = confDir;
@@ -381,21 +379,25 @@
     if (values.empty())
     {
         log<level::NOTICE>("Unable to get the value for Network[DHCP]");
-        return dhcp;
+        return EthernetInterfaceIntf::DHCPConf::none;
     }
-    if (values.back() == "true")
+    if (config::icaseeq(values.back(), "ipv4"))
     {
-        dhcp = EthernetInterfaceIntf::DHCPConf::both;
+        return EthernetInterfaceIntf::DHCPConf::v4;
     }
-    else if (values.back() == "ipv4")
+    if (config::icaseeq(values.back(), "ipv6"))
     {
-        dhcp = EthernetInterfaceIntf::DHCPConf::v4;
+        return EthernetInterfaceIntf::DHCPConf::v6;
     }
-    else if (values.back() == "ipv6")
+    auto ret = config::parseBool(values.back());
+    if (!ret.has_value())
     {
-        dhcp = EthernetInterfaceIntf::DHCPConf::v6;
+        auto str =
+            fmt::format("Unable to parse Network[DHCP]: `{}`", values.back());
+        log<level::NOTICE>(str.c_str());
     }
-    return dhcp;
+    return ret.value_or(false) ? EthernetInterfaceIntf::DHCPConf::both
+                               : EthernetInterfaceIntf::DHCPConf::none;
 }
 
 namespace mac_address