|  | // 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. | 
|  |  | 
|  | #ifndef LIBWEAVE_SRC_COMMANDS_COMMAND_DEFINITION_H_ | 
|  | #define LIBWEAVE_SRC_COMMANDS_COMMAND_DEFINITION_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include <base/macros.h> | 
|  |  | 
|  | #include "src/commands/object_schema.h" | 
|  |  | 
|  | namespace weave { | 
|  |  | 
|  | enum class UserRole { | 
|  | kViewer, | 
|  | kUser, | 
|  | kManager, | 
|  | kOwner, | 
|  | }; | 
|  |  | 
|  | // A simple GCD command definition. This class contains the full object schema | 
|  | // describing the command parameter types and constraints. | 
|  | class CommandDefinition final { | 
|  | public: | 
|  | struct Visibility { | 
|  | Visibility() = default; | 
|  | Visibility(bool is_local, bool is_cloud) | 
|  | : local{is_local}, cloud{is_cloud} {} | 
|  |  | 
|  | // Converts a comma-separated string of visibility identifiers into the | 
|  | // Visibility bitset (|str| is a string like "local,cloud"). | 
|  | // Special string value "all" is treated as a list of every possible | 
|  | // visibility values and "none" to have all the bits cleared. | 
|  | bool FromString(const std::string& str, ErrorPtr* error); | 
|  |  | 
|  | // Converts the visibility bitset to a string. | 
|  | std::string ToString() const; | 
|  |  | 
|  | static Visibility GetAll() { return Visibility{true, true}; } | 
|  | static Visibility GetLocal() { return Visibility{true, false}; } | 
|  | static Visibility GetCloud() { return Visibility{false, true}; } | 
|  | static Visibility GetNone() { return Visibility{false, false}; } | 
|  |  | 
|  | bool local{false};  // Command is available to local clients. | 
|  | bool cloud{false};  // Command is available to cloud clients. | 
|  | }; | 
|  |  | 
|  | CommandDefinition(std::unique_ptr<const ObjectSchema> parameters, | 
|  | std::unique_ptr<const ObjectSchema> progress, | 
|  | std::unique_ptr<const ObjectSchema> results); | 
|  |  | 
|  | // Gets the object schema for command parameters. | 
|  | const ObjectSchema* GetParameters() const { return parameters_.get(); } | 
|  | // Gets the object schema for command progress. | 
|  | const ObjectSchema* GetProgress() const { return progress_.get(); } | 
|  | // Gets the object schema for command results. | 
|  | const ObjectSchema* GetResults() const { return results_.get(); } | 
|  | // Returns the command visibility. | 
|  | const Visibility& GetVisibility() const { return visibility_; } | 
|  | // Changes the command visibility. | 
|  | void SetVisibility(const Visibility& visibility); | 
|  | // Returns the role required to execute command. | 
|  | UserRole GetMinimalRole() const { return minimal_role_; } | 
|  | // Changes the role required to execute command. | 
|  | void SetMinimalRole(UserRole minimal_role) { minimal_role_ = minimal_role; } | 
|  |  | 
|  | private: | 
|  | std::unique_ptr<const ObjectSchema> parameters_;  // Command parameters def. | 
|  | std::unique_ptr<const ObjectSchema> progress_;    // Command progress def. | 
|  | std::unique_ptr<const ObjectSchema> results_;     // Command results def. | 
|  | Visibility visibility_;  // Available to all by default. | 
|  | // Minimal role required to execute command. | 
|  | UserRole minimal_role_{UserRole::kUser}; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(CommandDefinition); | 
|  | }; | 
|  |  | 
|  | }  // namespace weave | 
|  |  | 
|  | #endif  // LIBWEAVE_SRC_COMMANDS_COMMAND_DEFINITION_H_ |