blob: d7ebc831f77a4b2659023505fff9b001c39e0b73 [file] [log] [blame] [edit]
// 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