// 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 <lib/trace/event.h>

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

namespace component {

constexpr char kRunner[] = "runner";

void 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;
  }
  ParseFromDocument(document, json_parser);
}

void 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;
  }
  if (!runner->value.IsString()) {
    json_parser->ReportError("'runner' is not a string.");
    return;
  }
  runner_ = runner->value.GetString();
  null_ = false;
}

}  // namespace component
