| // Copyright 2018 The Chromium OS 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 <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "runtime_probe/probe_function.h" |
| #include "runtime_probe/probe_function_argument.h" |
| |
| namespace runtime_probe { |
| |
| #define _DEFINE_PARSE_ARGUMENT(type, GetType) \ |
| template <> \ |
| bool ParseArgumentInternal<type>(const char* function_name, \ |
| const char* member_name, type* member, \ |
| const base::Value& value) { \ |
| if (!value.is_##type()) { \ |
| LOG(ERROR) << function_name << ": `" << member_name \ |
| << "` should be " #type; \ |
| return false; \ |
| } \ |
| *member = value.GetType(); \ |
| return true; \ |
| } |
| |
| using std::string; |
| _DEFINE_PARSE_ARGUMENT(string, GetString); |
| _DEFINE_PARSE_ARGUMENT(bool, GetBool); |
| _DEFINE_PARSE_ARGUMENT(double, GetDouble); |
| _DEFINE_PARSE_ARGUMENT(int, GetInt); |
| |
| template <> |
| bool ParseArgumentInternal<std::vector<std::string>>( |
| const char* function_name, |
| const char* member_name, |
| std::vector<std::string>* member, |
| const base::Value& value) { |
| if (!value.is_list()) { |
| LOG(ERROR) << "failed to parse " << value << " as a list of string."; |
| return false; |
| } |
| |
| std::vector<std::string> tmp; |
| |
| for (const auto& v : value.GetList()) { |
| if (!v.is_string()) { |
| LOG(ERROR) << "failed to parse " << value << " as a list of string."; |
| return false; |
| } |
| |
| tmp.push_back(v.GetString()); |
| } |
| member->swap(tmp); |
| return true; |
| } |
| |
| template <> |
| bool ParseArgumentInternal<std::vector<std::unique_ptr<ProbeFunction>>>( |
| const char* function_name, |
| const char* member_name, |
| std::vector<std::unique_ptr<ProbeFunction>>* member, |
| const base::Value& value) { |
| if (!value.is_list()) { |
| LOG(ERROR) << "failed to parse " << value |
| << " as a list of probe functions."; |
| return false; |
| } |
| |
| std::vector<std::unique_ptr<ProbeFunction>> tmp; |
| |
| for (const auto& v : value.GetList()) { |
| auto ptr = runtime_probe::ProbeFunction::FromValue(v); |
| if (!ptr) { |
| LOG(ERROR) << "failed to parse " << value |
| << " as a list of probe functions."; |
| return false; |
| } |
| |
| tmp.push_back(std::move(ptr)); |
| } |
| |
| member->swap(tmp); |
| return true; |
| } |
| |
| } // namespace runtime_probe |