buffet: Add parsing of command instances from JSON
CommandInstance class can be created from a JSON object
with proper command and parameter value validation against
command definition schema.
BUG=chromium:396713
TEST=USE=buffet P2_TEST_FILTER="buffet::*" FEATURES=test emerge-link platform2
Change-Id: Iba4c807225552f6a9d8b33a0aa1fc451e75753a4
Reviewed-on: https://chromium-review.googlesource.com/211338
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/commands/command_instance.h b/buffet/commands/command_instance.h
index 0028c88..f5d259d 100644
--- a/buffet/commands/command_instance.h
+++ b/buffet/commands/command_instance.h
@@ -13,15 +13,23 @@
#include "buffet/commands/prop_values.h"
#include "buffet/commands/schema_utils.h"
+#include "buffet/error.h"
+
+namespace base {
+class Value;
+} // namespace base
namespace buffet {
+class CommandDictionary;
+
class CommandInstance final {
public:
// Construct a command instance given the full command |name| which must
// be in format "<package_name>.<command_name>", a command |category| and
// a list of parameters and their values specified in |parameters|.
- CommandInstance(const std::string& name, const std::string& category,
+ CommandInstance(const std::string& name,
+ const std::string& category,
const native_types::Object& parameters);
// Returns the full name of the command.
@@ -34,6 +42,15 @@
// with given name does not exist, returns null shared_ptr.
std::shared_ptr<const PropValue> FindParameter(const std::string& name) const;
+ // Parses a command instance JSON definition and constructs a CommandInstance
+ // object, checking the JSON |value| against the command definition schema
+ // found in command |dictionary|. On error, returns null unique_ptr and
+ // fills in error details in |error|.
+ static std::unique_ptr<const CommandInstance> FromJson(
+ const base::Value* value,
+ const CommandDictionary& dictionary,
+ ErrorPtr* error);
+
private:
// Full command name as "<package_name>.<command_name>".
std::string name_;