| // 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_ |