libweave: Cleanup enum to string conversion

Conversion should be done using weave::EnumToString
and weave::StringToEnum.
enum_to_string header moved public interface.

BUG=brillo:1242
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: I96af61ef0b263d4ec149b14a7c9055bd51bf2e4c
Reviewed-on: https://chromium-review.googlesource.com/285775
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index 1716756..33e22e8 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -62,6 +62,7 @@
         '../libweave/src/privet/peerd_client.cc',
         '../libweave/src/privet/privet_handler.cc',
         '../libweave/src/privet/privet_manager.cc',
+        '../libweave/src/privet/privet_types.cc',
         '../libweave/src/privet/security_manager.cc',
         '../libweave/src/privet/shill_client.cc',
         '../libweave/src/privet/wifi_bootstrap_manager.cc',
diff --git a/buffet/manager.cc b/buffet/manager.cc
index a8f6112..9fa54cd 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -23,6 +23,8 @@
 #include <dbus/object_path.h>
 #include <dbus/values_util.h>
 
+#include "weave/enum_to_string.h"
+
 using chromeos::dbus_utils::AsyncEventSequencer;
 using chromeos::dbus_utils::ExportedObjectManager;
 
@@ -37,21 +39,6 @@
 const char kErrorDomain[] = "buffet";
 const char kNotImplemented[] = "notImplemented";
 
-std::string StatusToString(weave::RegistrationStatus status) {
-  switch (status) {
-    case weave::RegistrationStatus::kUnconfigured:
-      return "unconfigured";
-    case weave::RegistrationStatus::kConnecting:
-      return "connecting";
-    case weave::RegistrationStatus::kConnected:
-      return "connected";
-    case weave::RegistrationStatus::kInvalidCredentials:
-      return "invalid_credentials";
-  }
-  CHECK(0) << "Unknown status";
-  return "unknown";
-}
-
 }  // anonymous namespace
 
 Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager)
@@ -185,8 +172,12 @@
 
   chromeos::ErrorPtr error;
   weave::UserRole role;
-  if (!FromString(in_user_role, &role, &error))
+  if (!StringToEnum(in_user_role, &role)) {
+    chromeos::Error::AddToPrintf(&error, FROM_HERE, kErrorDomain,
+                                 "invalid_user_role", "Invalid role: '%s'",
+                                 in_user_role.c_str());
     return response->ReplyWithError(error.get());
+  }
 
   std::string id;
   if (!device_->GetCommands()->AddCommand(*command, role, &id, &error))
@@ -305,7 +296,7 @@
 }
 
 void Manager::OnRegistrationChanged(weave::RegistrationStatus status) {
-  dbus_adaptor_.SetStatus(StatusToString(status));
+  dbus_adaptor_.SetStatus(weave::EnumToString(status));
 }
 
 void Manager::OnConfigChanged(const weave::BuffetConfig& config) {
@@ -319,22 +310,8 @@
   dbus_adaptor_.SetAnonymousAccessRole(config.local_anonymous_access_role());
 }
 
-void Manager::UpdateWiFiBootstrapState(
-    weave::privet::WifiBootstrapManager::State state) {
-  switch (state) {
-    case weave::WifiSetupState::kDisabled:
-      dbus_adaptor_.SetWiFiBootstrapState("disabled");
-      break;
-    case weave::WifiSetupState::kBootstrapping:
-      dbus_adaptor_.SetWiFiBootstrapState("waiting");
-      break;
-    case weave::WifiSetupState::kMonitoring:
-      dbus_adaptor_.SetWiFiBootstrapState("monitoring");
-      break;
-    case weave::WifiSetupState::kConnecting:
-      dbus_adaptor_.SetWiFiBootstrapState("connecting");
-      break;
-  }
+void Manager::UpdateWiFiBootstrapState(weave::WifiSetupState state) {
+  dbus_adaptor_.SetWiFiBootstrapState(weave::EnumToString(state));
 }
 
 void Manager::OnPairingStart(const std::string& session_id,
@@ -344,7 +321,7 @@
   // the most recent pairing attempt.
   dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{
       {kPairingSessionIdKey, session_id},
-      {kPairingModeKey, weave::privet::PairingTypeToString(pairing_type)},
+      {kPairingModeKey, weave::EnumToString(pairing_type)},
       {kPairingCodeKey, code},
   });
 }
diff --git a/libweave/include/weave/enum_to_string.h b/libweave/include/weave/enum_to_string.h
new file mode 100644
index 0000000..647f990
--- /dev/null
+++ b/libweave/include/weave/enum_to_string.h
@@ -0,0 +1,72 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_INCLUDE_WEAVE_ENUM_TO_STRING_H_
+#define LIBWEAVE_INCLUDE_WEAVE_ENUM_TO_STRING_H_
+
+#include <base/logging.h>
+
+#include <string>
+
+namespace weave {
+
+// Helps to map enumeration to stings and back.
+//
+// Usage example:
+// .h file:
+// enum class MyEnum { kV1, kV2 };
+//
+// .cc file:
+// template <>
+// EnumToStringMap<MyEnum>::EnumToStringMap() : EnumToStringMap(kMap) { };
+template <typename T>
+class EnumToStringMap final {
+  static_assert(std::is_enum<T>::value, "The type must be an enumeration");
+
+ public:
+  struct Map {
+    const T id;
+    const char* const name;
+  };
+
+  EnumToStringMap();
+
+  const Map* begin() const { return begin_; }
+  const Map* end() const { return end_; }
+
+ private:
+  template <size_t size>
+  explicit EnumToStringMap(const Map(&map)[size])
+      : begin_(map), end_(map + size) {}
+
+  const Map* begin_;
+  const Map* end_;
+};
+
+template <typename T>
+std::string EnumToString(T id) {
+  for (const auto& m : EnumToStringMap<T>()) {
+    if (m.id == id) {
+      CHECK(m.name);
+      return m.name;
+    }
+  }
+  NOTREACHED();
+  return std::string();
+}
+
+template <typename T>
+bool StringToEnum(const std::string& name, T* id) {
+  for (const auto& m : EnumToStringMap<T>()) {
+    if (m.name && m.name == name) {
+      *id = m.id;
+      return true;
+    }
+  }
+  return false;
+}
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_ENUM_TO_STRING_H_
diff --git a/libweave/src/buffet_config.cc b/libweave/src/buffet_config.cc
index 2b62c27..5355566 100644
--- a/libweave/src/buffet_config.cc
+++ b/libweave/src/buffet_config.cc
@@ -13,6 +13,7 @@
 
 #include "libweave/src/storage_impls.h"
 #include "libweave/src/storage_interface.h"
+#include "weave/enum_to_string.h"
 
 namespace {
 
@@ -159,7 +160,7 @@
     for (const std::string& mode :
          chromeos::string_utils::Split(modes_str, ",", true, true)) {
       PairingType pairing_mode;
-      CHECK(privet::StringToPairingType(mode, &pairing_mode));
+      CHECK(StringToEnum(mode, &pairing_mode));
       pairing_modes.insert(pairing_mode);
     }
     pairing_modes_ = std::move(pairing_modes);
diff --git a/libweave/src/commands/command_dictionary.cc b/libweave/src/commands/command_dictionary.cc
index 5ad1939..536c7fc 100644
--- a/libweave/src/commands/command_dictionary.cc
+++ b/libweave/src/commands/command_dictionary.cc
@@ -9,6 +9,7 @@
 
 #include "libweave/src/commands/command_definition.h"
 #include "libweave/src/commands/schema_constants.h"
+#include "weave/enum_to_string.h"
 
 namespace weave {
 
@@ -131,7 +132,11 @@
 
       if (command_def_json->GetString(commands::attributes::kCommand_Role,
                                       &value)) {
-        if (!FromString(value, &minimal_role, error)) {
+        if (!StringToEnum(value, &minimal_role)) {
+          chromeos::Error::AddToPrintf(error, FROM_HERE,
+                                       errors::commands::kDomain,
+                                       errors::commands::kInvalidPropValue,
+                                       "Invalid role: '%s'", value.c_str());
           chromeos::Error::AddToPrintf(
               error, FROM_HERE, errors::commands::kDomain,
               errors::commands::kInvalidMinimalRole,
@@ -236,7 +241,7 @@
     command_def->Set(commands::attributes::kCommand_Parameters,
                      parameters.release());
     command_def->SetString(commands::attributes::kCommand_Role,
-                           ToString(pair.second->GetMinimalRole()));
+                           EnumToString(pair.second->GetMinimalRole()));
     package->SetWithoutPathExpansion(command_name, command_def);
   }
   return dict;
diff --git a/libweave/src/commands/command_manager.cc b/libweave/src/commands/command_manager.cc
index 3deb36a..1b59da6 100644
--- a/libweave/src/commands/command_manager.cc
+++ b/libweave/src/commands/command_manager.cc
@@ -11,6 +11,7 @@
 
 #include "libweave/src/commands/schema_constants.h"
 #include "libweave/src/utils.h"
+#include "weave/enum_to_string.h"
 
 using chromeos::dbus_utils::ExportedObjectManager;
 
@@ -113,8 +114,8 @@
   if (role < minimal_role) {
     chromeos::Error::AddToPrintf(
         error, FROM_HERE, errors::commands::kDomain, "access_denied",
-        "User role '%s' less than minimal: '%s'", ToString(role).c_str(),
-        ToString(minimal_role).c_str());
+        "User role '%s' less than minimal: '%s'", EnumToString(role).c_str(),
+        EnumToString(minimal_role).c_str());
     return false;
   }
 
diff --git a/libweave/src/commands/enum_to_string.h b/libweave/src/commands/enum_to_string.h
deleted file mode 100644
index f1de19b..0000000
--- a/libweave/src/commands/enum_to_string.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIBWEAVE_SRC_COMMANDS_ENUM_TO_STRING_H_
-#define LIBWEAVE_SRC_COMMANDS_ENUM_TO_STRING_H_
-
-#include <string>
-
-namespace weave {
-
-// Helps to map enumeration to stings and back.
-//
-// Usage example:
-// .h file:
-// enum class MyEnum { kV1, kV2 };
-// std::string ToString(MyEnum id);
-// bool FromString(const std::string& str, MyEnum* id);
-//
-// .cc file:
-// template <>
-// const EnumToString<MyEnum>::Map EnumToString<MyEnum>::kMap[] = {
-//     {MyEnum::kV1, "v1"},
-//     {MyEnum::kV2, "v2"},
-// };
-//
-// std::string ToString(MyEnum id) {
-//   return EnumToString<MyEnum>::FindNameById(id);
-// }
-//
-// bool FromString(const std::string& str, MyEnum* id) {
-//   return EnumToString<MyEnum>::FindIdByName(str, id));
-// }
-template <typename T>
-class EnumToString final {
- public:
-  static std::string FindNameById(T id) {
-    for (const Map& m : kMap) {
-      if (m.id == id) {
-        CHECK(m.name);
-        return m.name;
-      }
-    }
-    NOTREACHED();
-    return std::string();
-  }
-
-  static bool FindIdByName(const std::string& name, T* id) {
-    for (const Map& m : kMap) {
-      if (m.name && m.name == name) {
-        *id = m.id;
-        return true;
-      }
-    }
-    return false;
-  }
-
- private:
-  struct Map {
-    const T id;
-    const char* const name;
-  };
-
-  static const Map kMap[];
-};
-
-}  // namespace weave
-
-#endif  // LIBWEAVE_SRC_COMMANDS_ENUM_TO_STRING_H_
diff --git a/libweave/src/commands/user_role.cc b/libweave/src/commands/user_role.cc
index 2edd620..87edad1 100644
--- a/libweave/src/commands/user_role.cc
+++ b/libweave/src/commands/user_role.cc
@@ -6,32 +6,24 @@
 
 #include <chromeos/errors/error.h>
 
-#include "libweave/src/commands/enum_to_string.h"
 #include "libweave/src/commands/schema_constants.h"
+#include "weave/enum_to_string.h"
 
 namespace weave {
 
-template <>
-const EnumToString<UserRole>::Map EnumToString<UserRole>::kMap[] = {
+namespace {
+
+const EnumToStringMap<UserRole>::Map kMap[] = {
     {UserRole::kViewer, commands::attributes::kCommand_Role_Viewer},
     {UserRole::kUser, commands::attributes::kCommand_Role_User},
     {UserRole::kOwner, commands::attributes::kCommand_Role_Owner},
     {UserRole::kManager, commands::attributes::kCommand_Role_Manager},
 };
 
-std::string ToString(UserRole role) {
-  return EnumToString<UserRole>::FindNameById(role);
-}
+}  // namespace
 
-bool FromString(const std::string& str,
-                UserRole* role,
-                chromeos::ErrorPtr* error) {
-  if (EnumToString<UserRole>::FindIdByName(str, role))
-    return true;
-  chromeos::Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain,
-                               errors::commands::kInvalidPropValue,
-                               "Invalid role: '%s'", str.c_str());
-  return false;
-}
+template <>
+EnumToStringMap<UserRole>::EnumToStringMap()
+    : EnumToStringMap(kMap) {}
 
 }  // namespace weave
diff --git a/libweave/src/commands/user_role.h b/libweave/src/commands/user_role.h
index c422dfa..5f5b3d7 100644
--- a/libweave/src/commands/user_role.h
+++ b/libweave/src/commands/user_role.h
@@ -17,12 +17,6 @@
   kOwner,
 };
 
-std::string ToString(UserRole role);
-
-bool FromString(const std::string& str,
-                UserRole* role,
-                chromeos::ErrorPtr* error);
-
 }  // namespace weave
 
 #endif  // LIBWEAVE_SRC_COMMANDS_USER_ROLE_H_
diff --git a/libweave/src/privet/cloud_delegate.cc b/libweave/src/privet/cloud_delegate.cc
index 8f2aefc..c5efb4d 100644
--- a/libweave/src/privet/cloud_delegate.cc
+++ b/libweave/src/privet/cloud_delegate.cc
@@ -21,8 +21,8 @@
 #include "libweave/src/commands/command_manager.h"
 #include "libweave/src/device_registration_info.h"
 #include "libweave/src/privet/constants.h"
-#include "libweave/src/registration_status.h"
 #include "libweave/src/states/state_manager.h"
+#include "weave/enum_to_string.h"
 
 using chromeos::ErrorPtr;
 using chromeos::VariantDictionary;
@@ -125,8 +125,8 @@
 
   AuthScope GetAnonymousMaxScope() const override {
     AuthScope scope;
-    if (StringToAuthScope(device_->GetConfig().local_anonymous_access_role(),
-                          &scope)) {
+    if (StringToEnum(device_->GetConfig().local_anonymous_access_role(),
+                     &scope)) {
       return scope;
     }
     return AuthScope::kNone;
@@ -177,8 +177,13 @@
 
     chromeos::ErrorPtr error;
     UserRole role;
-    if (!FromString(AuthScopeToString(user_info.scope()), &role, &error))
+    std::string str_scope = EnumToString(user_info.scope());
+    if (!StringToEnum(str_scope, &role)) {
+      chromeos::Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
+                                   errors::kInvalidParams, "Invalid role: '%s'",
+                                   str_scope.c_str());
       return error_callback.Run(error.get());
+    }
 
     std::string id;
     if (!command_manager_->AddCommand(command, role, &id, &error))
@@ -258,7 +263,7 @@
       chromeos::ErrorPtr error;
       chromeos::Error::AddToPrintf(
           &error, FROM_HERE, errors::kDomain, errors::kInvalidState,
-          "Unexpected buffet status: %s", StatusToString(status).c_str());
+          "Unexpected buffet status: %s", EnumToString(status).c_str());
       connection_state_ = ConnectionState{std::move(error)};
     }
     NotifyOnDeviceInfoChanged();
diff --git a/libweave/src/privet/privet_handler.cc b/libweave/src/privet/privet_handler.cc
index 22f10a0..914922e 100644
--- a/libweave/src/privet/privet_handler.cc
+++ b/libweave/src/privet/privet_handler.cc
@@ -24,6 +24,7 @@
 #include "libweave/src/privet/identity_delegate.h"
 #include "libweave/src/privet/security_delegate.h"
 #include "libweave/src/privet/wifi_delegate.h"
+#include "weave/enum_to_string.h"
 
 namespace weave {
 namespace privet {
@@ -121,86 +122,6 @@
   return value_list;
 }
 
-template <typename T>
-class EnumToStringMap final {
- public:
-  static std::string FindNameById(T id) {
-    for (const Map& m : kMap) {
-      if (m.id == id) {
-        CHECK(m.name);
-        return m.name;
-      }
-    }
-    NOTREACHED() << static_cast<int>(id) << " is not part of "
-                 << typeid(T).name();
-    return std::string();
-  }
-
-  static bool FindIdByName(const std::string& name, T* id) {
-    for (const Map& m : kMap) {
-      if (m.name && m.name == name) {
-        *id = m.id;
-        return true;
-      }
-    }
-    return false;
-  }
-
- private:
-  struct Map {
-    const T id;
-    const char* const name;
-  };
-  static const Map kMap[];
-};
-
-template <>
-const EnumToStringMap<ConnectionState::Status>::Map
-    EnumToStringMap<ConnectionState::Status>::kMap[] = {
-        {ConnectionState::kDisabled, "disabled"},
-        {ConnectionState::kUnconfigured, "unconfigured"},
-        {ConnectionState::kConnecting, "connecting"},
-        {ConnectionState::kOnline, "online"},
-        {ConnectionState::kOffline, "offline"},
-};
-
-template <>
-const EnumToStringMap<SetupState::Status>::Map
-    EnumToStringMap<SetupState::Status>::kMap[] = {
-        {SetupState::kNone, nullptr},
-        {SetupState::kInProgress, "inProgress"},
-        {SetupState::kSuccess, "success"},
-};
-
-template <>
-const EnumToStringMap<WifiType>::Map EnumToStringMap<WifiType>::kMap[] = {
-    {WifiType::kWifi24, "2.4GHz"},
-    {WifiType::kWifi50, "5.0GHz"},
-};
-
-template <>
-const EnumToStringMap<PairingType>::Map EnumToStringMap<PairingType>::kMap[] = {
-    {PairingType::kPinCode, "pinCode"},
-    {PairingType::kEmbeddedCode, "embeddedCode"},
-    {PairingType::kUltrasound32, "ultrasound32"},
-    {PairingType::kAudible32, "audible32"},
-};
-
-template <>
-const EnumToStringMap<CryptoType>::Map EnumToStringMap<CryptoType>::kMap[] = {
-    {CryptoType::kNone, "none"},
-    {CryptoType::kSpake_p224, "p224_spake2"},
-    {CryptoType::kSpake_p256, "p256_spake2"},
-};
-
-template <>
-const EnumToStringMap<AuthScope>::Map EnumToStringMap<AuthScope>::kMap[] = {
-    {AuthScope::kNone, "none"},
-    {AuthScope::kViewer, "viewer"},
-    {AuthScope::kUser, "user"},
-    {AuthScope::kOwner, "owner"},
-};
-
 struct {
   const char* const reason;
   int code;
@@ -226,16 +147,6 @@
     {errors::kNotImplemented, chromeos::http::status_code::NotSupported},
 };
 
-template <typename T>
-std::string EnumToString(T id) {
-  return EnumToStringMap<T>::FindNameById(id);
-}
-
-template <typename T>
-bool StringToEnum(const std::string& name, T* id) {
-  return EnumToStringMap<T>::FindIdByName(name, id);
-}
-
 AuthScope AuthScopeFromString(const std::string& scope, AuthScope auto_scope) {
   if (scope == kAuthScopeAutoValue)
     return auto_scope;
@@ -931,21 +842,5 @@
                         base::Bind(&OnCommandRequestFailed, callback));
 }
 
-bool StringToPairingType(const std::string& mode, PairingType* id) {
-  return StringToEnum(mode, id);
-}
-
-std::string PairingTypeToString(PairingType id) {
-  return EnumToString(id);
-}
-
-bool StringToAuthScope(const std::string& scope, AuthScope* id) {
-  return StringToEnum(scope, id);
-}
-
-std::string AuthScopeToString(AuthScope id) {
-  return EnumToString(id);
-}
-
 }  // namespace privet
 }  // namespace weave
diff --git a/libweave/src/privet/privet_types.cc b/libweave/src/privet/privet_types.cc
new file mode 100644
index 0000000..7c68929
--- /dev/null
+++ b/libweave/src/privet/privet_types.cc
@@ -0,0 +1,98 @@
+// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "libweave/src/privet/privet_types.h"
+
+#include <string>
+
+#include "weave/enum_to_string.h"
+#include "weave/types.h"
+
+namespace weave {
+
+namespace {
+
+using privet::AuthScope;
+using privet::ConnectionState;
+using privet::CryptoType;
+using privet::SetupState;
+using privet::WifiType;
+
+const EnumToStringMap<PairingType>::Map kPairingTypeMap[] = {
+    {PairingType::kPinCode, "pinCode"},
+    {PairingType::kEmbeddedCode, "embeddedCode"},
+    {PairingType::kUltrasound32, "ultrasound32"},
+    {PairingType::kAudible32, "audible32"},
+};
+
+const EnumToStringMap<ConnectionState::Status>::Map kConnectionStateMap[] = {
+    {ConnectionState::kDisabled, "disabled"},
+    {ConnectionState::kUnconfigured, "unconfigured"},
+    {ConnectionState::kConnecting, "connecting"},
+    {ConnectionState::kOnline, "online"},
+    {ConnectionState::kOffline, "offline"},
+};
+
+const EnumToStringMap<SetupState::Status>::Map kSetupStateMap[] = {
+    {SetupState::kNone, nullptr},
+    {SetupState::kInProgress, "inProgress"},
+    {SetupState::kSuccess, "success"},
+};
+
+const EnumToStringMap<WifiType>::Map kWifiTypeMap[] = {
+    {WifiType::kWifi24, "2.4GHz"},
+    {WifiType::kWifi50, "5.0GHz"},
+};
+
+const EnumToStringMap<CryptoType>::Map kCryptoTypeMap[] = {
+    {CryptoType::kNone, "none"},
+    {CryptoType::kSpake_p224, "p224_spake2"},
+    {CryptoType::kSpake_p256, "p256_spake2"},
+};
+
+const EnumToStringMap<AuthScope>::Map kAuthScopeMap[] = {
+    {AuthScope::kNone, "none"},
+    {AuthScope::kViewer, "viewer"},
+    {AuthScope::kUser, "user"},
+    {AuthScope::kOwner, "owner"},
+};
+
+const EnumToStringMap<WifiSetupState>::Map kWifiSetupStateMap[] = {
+    {WifiSetupState::kDisabled, "disabled"},
+    {WifiSetupState::kBootstrapping, "waiting"},
+    {WifiSetupState::kMonitoring, "monitoring"},
+    {WifiSetupState::kConnecting, "connecting"},
+};
+
+}  // namespace
+
+template <>
+EnumToStringMap<PairingType>::EnumToStringMap()
+    : EnumToStringMap(kPairingTypeMap) {}
+
+template <>
+EnumToStringMap<ConnectionState::Status>::EnumToStringMap()
+    : EnumToStringMap(kConnectionStateMap) {}
+
+template <>
+EnumToStringMap<SetupState::Status>::EnumToStringMap()
+    : EnumToStringMap(kSetupStateMap) {}
+
+template <>
+EnumToStringMap<WifiType>::EnumToStringMap()
+    : EnumToStringMap(kWifiTypeMap) {}
+
+template <>
+EnumToStringMap<CryptoType>::EnumToStringMap()
+    : EnumToStringMap(kCryptoTypeMap) {}
+
+template <>
+EnumToStringMap<AuthScope>::EnumToStringMap()
+    : EnumToStringMap(kAuthScopeMap) {}
+
+template <>
+EnumToStringMap<WifiSetupState>::EnumToStringMap()
+    : EnumToStringMap(kWifiSetupStateMap) {}
+
+}  // namespace weave
diff --git a/libweave/src/privet/privet_types.h b/libweave/src/privet/privet_types.h
index 6247f6d..7626400 100644
--- a/libweave/src/privet/privet_types.h
+++ b/libweave/src/privet/privet_types.h
@@ -12,6 +12,17 @@
 namespace weave {
 namespace privet {
 
+enum class CryptoType {
+  kNone,
+  kSpake_p224,
+  kSpake_p256,
+};
+
+enum class WifiType {
+  kWifi24,
+  kWifi50,
+};
+
 // Scopes in order of increasing privileges.
 enum class AuthScope {
   kNone,
diff --git a/libweave/src/privet/security_delegate.h b/libweave/src/privet/security_delegate.h
index 57098f6..616cc3d 100644
--- a/libweave/src/privet/security_delegate.h
+++ b/libweave/src/privet/security_delegate.h
@@ -18,12 +18,6 @@
 namespace weave {
 namespace privet {
 
-enum class CryptoType {
-  kNone,
-  kSpake_p224,
-  kSpake_p256,
-};
-
 // Interface to provide Security related logic for |PrivetHandler|.
 class SecurityDelegate {
  public:
@@ -63,12 +57,6 @@
                              chromeos::ErrorPtr* error) = 0;
 };
 
-bool StringToPairingType(const std::string& mode, PairingType* id);
-std::string PairingTypeToString(PairingType id);
-
-bool StringToAuthScope(const std::string& scope, AuthScope* id);
-std::string AuthScopeToString(AuthScope id);
-
 }  // namespace privet
 }  // namespace weave
 
diff --git a/libweave/src/privet/wifi_delegate.h b/libweave/src/privet/wifi_delegate.h
index 7cab3d0..ae71849 100644
--- a/libweave/src/privet/wifi_delegate.h
+++ b/libweave/src/privet/wifi_delegate.h
@@ -14,11 +14,6 @@
 namespace weave {
 namespace privet {
 
-enum class WifiType {
-  kWifi24,
-  kWifi50,
-};
-
 // Interface to provide WiFi functionality for PrivetHandler.
 class WifiDelegate {
  public:
diff --git a/libweave/src/registration_status.cc b/libweave/src/registration_status.cc
index 1a56f75..8392d57 100644
--- a/libweave/src/registration_status.cc
+++ b/libweave/src/registration_status.cc
@@ -2,25 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "libweave/src/registration_status.h"
-
-#include <base/logging.h>
+#include "weave/enum_to_string.h"
+#include "weave/types.h"
 
 namespace weave {
 
-std::string StatusToString(RegistrationStatus status) {
-  switch (status) {
-    case RegistrationStatus::kUnconfigured:
-      return "unconfigured";
-    case RegistrationStatus::kConnecting:
-      return "connecting";
-    case RegistrationStatus::kConnected:
-      return "connected";
-    case RegistrationStatus::kInvalidCredentials:
-      return "invalid_credentials";
-  }
-  CHECK(0) << "Unknown status";
-  return "unknown";
-}
+namespace {
+
+const EnumToStringMap<RegistrationStatus>::Map kMap[] = {
+    {RegistrationStatus::kUnconfigured, "unconfigured"},
+    {RegistrationStatus::kConnecting, "connecting"},
+    {RegistrationStatus::kConnected, "connected"},
+    {RegistrationStatus::kInvalidCredentials, "invalid_credentials"},
+};
+
+}  // namespace
+
+template <>
+EnumToStringMap<RegistrationStatus>::EnumToStringMap()
+    : EnumToStringMap(kMap) {}
 
 }  // namespace weave
diff --git a/libweave/src/registration_status.h b/libweave/src/registration_status.h
deleted file mode 100644
index 6511de1..0000000
--- a/libweave/src/registration_status.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIBWEAVE_SRC_REGISTRATION_STATUS_H_
-#define LIBWEAVE_SRC_REGISTRATION_STATUS_H_
-
-#include <string>
-
-#include "weave/types.h"
-
-namespace weave {
-
-// TODO(vitalybuka): Use EnumToString.
-std::string StatusToString(RegistrationStatus status);
-
-}  // namespace weave
-
-#endif  // LIBWEAVE_SRC_REGISTRATION_STATUS_H_