// Copyright 2017 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/lib/cmx/runtime.h"

#include <trace/event.h>

#include "rapidjson/document.h"
#include "src/lib/json_parser/json_parser.h"

namespace component {

constexpr char kRunner[] = "runner";

bool RuntimeMetadata::ParseFromFileAt(int dirfd, const std::string& file,
                                      json::JSONParser* json_parser) {
  TRACE_DURATION("cmx", "RuntimeMetadata::ParseFromFileAt", "file", file);
  runner_.clear();
  null_ = true;

  rapidjson::Document document = json_parser->ParseFromFileAt(dirfd, file);
  if (json_parser->HasError()) {
    return false;
  }
  return ParseFromDocument(document, json_parser);
}

bool RuntimeMetadata::ParseFromDocument(const rapidjson::Document& document,
                                        json::JSONParser* json_parser) {
  runner_.clear();
  null_ = true;

  const auto runner = document.FindMember(kRunner);
  if (runner == document.MemberEnd()) {
    // Valid config, but no runtime.
    return true;
  }
  if (!runner->value.IsString()) {
    json_parser->ReportError("'runner' is not a string.");
    return false;
  }
  runner_ = runner->value.GetString();
  null_ = false;
  return true;
}

}  // namespace component
