// 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/exception_broker/json_utils.h"

#include <third_party/rapidjson/include/rapidjson/document.h>
#include <third_party/rapidjson/include/rapidjson/error/en.h>

#include "src/lib/syslog/cpp/logger.h"

namespace fuchsia {
namespace exception {

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 exception
}  // namespace fuchsia
