// Copyright 2018 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 "peridot/lib/module_manifest_source/json.h"

#include "peridot/lib/fidl/json_xdr.h"
#include "peridot/lib/rapidjson/rapidjson.h"
#include "third_party/rapidjson/rapidjson/document.h"

namespace modular {

namespace {

void XdrNounConstraint(modular::XdrContext* const xdr,
                       modular::NounConstraint* const data) {
  xdr->Field("name", &data->name);
  xdr->Field("type", &data->type);
}

void XdrEntry(modular::XdrContext* const xdr,
              modular::ModuleManifest* const data) {
  xdr->Field("binary", &data->binary);
  xdr->Field("suggestion_headline", &data->suggestion_headline);
  xdr->Field("verb", &data->verb);
  xdr->ReadErrorHandler([data] { data->composition_pattern = ""; })
      ->Field("composition_pattern", &data->composition_pattern);
  xdr->Field("noun_constraints", &data->noun_constraints, XdrNounConstraint);
}

}  // namespace

bool ModuleManifestEntryFromJson(const std::string& json,
                                 modular::ModuleManifest* entry) {
  rapidjson::Document doc;
  // Schema validation of the JSON is happening at publish time. By the time we
  // get here, we assume it's valid manifest JSON.
  doc.Parse(json.c_str());

  // Handle bad manifests, including older files expressed as an array.
  // Any mismatch causes XdrRead to DCHECK.
  if (!doc.IsObject()) {
    return false;
  }

  // Our tooling validates |doc|'s JSON schema so that we don't have to here.
  // It may be good to do this, though.
  // TODO(thatguy): Do this if it becomes a problem.
  if (!modular::XdrRead(&doc, entry, XdrEntry)) {
    return false;
  }
  return true;
}

void ModuleManifestEntryToJson(const modular::ModuleManifest& entry,
                               std::string* json) {
  rapidjson::Document doc;
  modular::ModuleManifest local_entry;
  fidl::Clone(entry, &local_entry);
  modular::XdrWrite(&doc, &local_entry, XdrEntry);

  *json = JsonValueToPrettyString(doc);
}

}  // namespace modular
