| // Copyright 2019 The Fuchsia 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/developer/forensics/exceptions/json_utils.h" |
| |
| #include <lib/syslog/cpp/macros.h> |
| |
| #include <third_party/rapidjson/include/rapidjson/document.h> |
| #include <third_party/rapidjson/include/rapidjson/error/en.h> |
| |
| namespace forensics { |
| namespace exceptions { |
| |
| std::set<std::string> ExtractFilters(const std::string& content) { |
| rapidjson::Document document; |
| if (rapidjson::ParseResult result = document.Parse(content.c_str()); result.IsError()) { |
| FX_LOGS(ERROR) << "Parsing config as JSON at offset " << result.Offset() << ": " |
| << rapidjson::GetParseError_En(result.Code()); |
| return {}; |
| } |
| |
| if (!document.IsObject()) { |
| FX_LOGS(ERROR) << "Config json is not an object."; |
| return {}; |
| } |
| |
| if (!document.HasMember("filters")) |
| return {}; |
| |
| auto& filters = document["filters"]; |
| if (!filters.IsArray()) { |
| FX_LOGS(WARNING) << "Filters member is not an array."; |
| return {}; |
| } |
| |
| std::set<std::string> result_filters; |
| for (uint32_t i = 0; i < filters.Size(); i++) { |
| auto& filter = filters[i]; |
| if (!filter.IsString()) { |
| FX_LOGS(WARNING) << "Filter " << i << " is not a string."; |
| continue; |
| } |
| |
| result_filters.insert(filter.GetString()); |
| } |
| |
| return result_filters; |
| } |
| |
| } // namespace exceptions |
| } // namespace forensics |