| // Copyright 2015 The Weave 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 "src/commands/command_definition.h" | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include <weave/error.h> | 
 | #include <weave/enum_to_string.h> | 
 |  | 
 | #include "src/commands/schema_constants.h" | 
 | #include "src/string_utils.h" | 
 |  | 
 | namespace weave { | 
 |  | 
 | 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}, | 
 | }; | 
 | } | 
 |  | 
 | template <> | 
 | LIBWEAVE_EXPORT EnumToStringMap<UserRole>::EnumToStringMap() | 
 |     : EnumToStringMap(kMap) {} | 
 |  | 
 | bool CommandDefinition::Visibility::FromString(const std::string& str, | 
 |                                                ErrorPtr* error) { | 
 |   // This special case is useful for places where we want to make a command | 
 |   // to ALL clients, even if new clients are added in the future. | 
 |   if (str == commands::attributes::kCommand_Visibility_All) { | 
 |     local = true; | 
 |     cloud = true; | 
 |     return true; | 
 |   } | 
 |  | 
 |   // Clear any bits first. | 
 |   local = false; | 
 |   cloud = false; | 
 |   if (str == commands::attributes::kCommand_Visibility_None) | 
 |     return true; | 
 |  | 
 |   for (const std::string& value : Split(str, ",", true, true)) { | 
 |     if (value == commands::attributes::kCommand_Visibility_Local) { | 
 |       local = true; | 
 |     } else if (value == commands::attributes::kCommand_Visibility_Cloud) { | 
 |       cloud = true; | 
 |     } else { | 
 |       Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain, | 
 |                          errors::commands::kInvalidPropValue, | 
 |                          "Invalid command visibility value '%s'", | 
 |                          value.c_str()); | 
 |       return false; | 
 |     } | 
 |   } | 
 |   return true; | 
 | } | 
 |  | 
 | std::string CommandDefinition::Visibility::ToString() const { | 
 |   if (local && cloud) | 
 |     return commands::attributes::kCommand_Visibility_All; | 
 |   if (!local && !cloud) | 
 |     return commands::attributes::kCommand_Visibility_None; | 
 |   if (local) | 
 |     return commands::attributes::kCommand_Visibility_Local; | 
 |   return commands::attributes::kCommand_Visibility_Cloud; | 
 | } | 
 |  | 
 | CommandDefinition::CommandDefinition( | 
 |     std::unique_ptr<const ObjectSchema> parameters, | 
 |     std::unique_ptr<const ObjectSchema> progress, | 
 |     std::unique_ptr<const ObjectSchema> results) | 
 |     : parameters_{std::move(parameters)}, | 
 |       progress_{std::move(progress)}, | 
 |       results_{std::move(results)} { | 
 |   // Set to be available to all clients by default. | 
 |   visibility_ = Visibility::GetAll(); | 
 | } | 
 |  | 
 | void CommandDefinition::SetVisibility(const Visibility& visibility) { | 
 |   visibility_ = visibility; | 
 | } | 
 |  | 
 | }  // namespace weave |