# Copyright 2020 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.

import("//build/config.gni")
import("//build/images/bootfs_manifest.gni")
import("//build/json/validate_json.gni")

template("node_config") {
  config_data("${target_name}_config_data") {
    for_pkg = "power_manager"
    sources = [ "${invoker.source}" ]
    outputs = [ "node_config.json" ]
  }

  validate_json("${target_name}_validate_json") {
    data = "${invoker.source}"
    schema = "node_config.schema.json"
  }

  group(target_name) {
    deps = [
      ":${target_name}_config_data",
      ":${target_name}_validate_json",
    ]
  }
}

template("node_config_bootfs_manifest") {
  validate_json("${target_name}_validate_json") {
    data = "${invoker.source}"
    schema = "node_config.schema.json"
  }
  bootfs_manifest(target_name) {
    deps = [ ":${target_name}_validate_json" ]
    config = [
      {
        path = "${invoker.source}"
        dest = "power_manager/node_config.json"
      },
    ]
  }
}

node_config("astro") {
  source = "astro_node_config.json"
}

node_config_bootfs_manifest("astro.manifest") {
  source = "astro_node_config.json"
}

node_config_bootfs_manifest("base.manifest") {
  source = "base_node_config.json"
}
