# Copyright 2021 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/compiled_action.gni")
import("//build/config/clang/clang.gni")
import("//build/host.gni")
import("//build/rust/config.gni")

# Compile a configuration value file.
#
# Parameters
#
#   cm (required)
#     Compiled manifest for which the value file should be compiled.
#     Type: path
#
#   value_file (required)
#     A JSON5 file containing the configuration values to be compiled.
#     Type: path
#
#   deps (optional)
#   metadata (optional)
#   output_name (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
template("cvf") {
  input_manifest = invoker.cm
  value_file = invoker.value_file

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "metadata",
                             "output_name",
                             "testonly",
                             "visibility",
                           ])

    if (!defined(output_name)) {
      output_name = target_name
    }

    tool = "//tools/configc"
    tool_output_name = "configc"

    compiled_output = "${target_out_dir}/${output_name}.cvf"
    inputs = [
      input_manifest,
      value_file,
    ]
    outputs = [ compiled_output ]

    args = [
      "cvf",
      "--cm",
      rebase_path(input_manifest, root_build_dir),
      "--values",
      rebase_path(value_file, root_build_dir),
      "--output",
      rebase_path(compiled_output, root_build_dir),
    ]
  }
}

# Generate the FIDL client library source files for a configuration declaration.
#
# Parameters
#
#   compiled_manifest (required)
#     Compiled manifest for which the source files should be generated.
#     Type: path
#
#   name (required)
#     Name for the generated FIDL library.
#     Type: string
#
#   deps (optional)
#   metadata (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
template("fidl_config_client_lib_source") {
  assert(defined(invoker.compiled_manifest),
         "the path to a compiled component manifest must be specified")
  assert(defined(invoker.name),
         "the name of this FIDL library must be specified")
  compiled_manifest = invoker.compiled_manifest

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])

    tool = "//tools/configc"
    tool_output_name = "configc"

    fidl_format_tool_label = "//tools/fidl/fidlc:fidl-format($host_toolchain)"
    fidl_format_tool_path =
        get_label_info(fidl_format_tool_label, "root_out_dir") + "/fidl-format"

    inputs = [
      compiled_manifest,
      fidl_format_tool_path,
    ]

    source_file_path = "${target_out_dir}/${target_name}.fidl"

    args = [
      "fidl",
      "--cm",
      rebase_path(compiled_manifest, root_build_dir),
      "--output",
      rebase_path(source_file_path, root_build_dir),
      "--library-name",
      invoker.name,
      "--fidl-format",
      rebase_path(fidl_format_tool_path, root_build_dir),
    ]

    if (!defined(deps)) {
      deps = []
    }

    deps += [ "//tools/fidl/fidlc:fidl-format($host_toolchain)" ]

    outputs = [ source_file_path ]

    metadata = {
      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }
      generated_sources = rebase_path(outputs, root_build_dir)
    }
  }
}

# Generate the Rust client library source files for a configuration declaration.
#
# Parameters
#
#   compiled_manifest (required)
#     Compiled manifest for which the source files should be generated.
#     Type: path
#
#   fidl_library_name (required)
#     Name for the internal FIDL library.
#     Type: string
#
#   deps (optional)
#   metadata (optional)
#   output_name (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
template("rust_config_client_lib_source") {
  assert(defined(invoker.compiled_manifest),
         "the path to a compiled component manifest must be specified")
  assert(defined(invoker.fidl_library_name),
         "the name of the internal FIDL library must be specified")
  compiled_manifest = invoker.compiled_manifest

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "name",
                             "testonly",
                             "visibility",
                           ])

    tool = "//tools/configc"
    tool_output_name = "configc"

    inputs = [
      compiled_manifest,
      "//rustfmt.toml",
      "$rustc_prefix/bin/rustfmt",
      rustc_version_file,
    ]

    source_file_path = "${target_out_dir}/${target_name}.rs"

    args = [
      "rust",
      "--cm",
      rebase_path(compiled_manifest, root_build_dir),
      "--output",
      rebase_path(source_file_path, root_build_dir),
      "--fidl-library-name",
      invoker.fidl_library_name,
      "--rustfmt",
      "$rebased_rustc_prefix/bin/rustfmt",
      "--rustfmt-config",
      rebase_path("//rustfmt.toml", root_build_dir),
    ]

    outputs = [ source_file_path ]

    metadata = {
      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }
      generated_sources = rebase_path(outputs, root_build_dir)
    }
  }
}

# Generate the C++ client library source files for a configuration declaration.
#
# Parameters
#
#   compiled_manifest (required)
#     Compiled manifest for which the source files should be generated.
#     Type: path
#
#   fidl_library_name (required)
#     Name for the internal FIDL library.
#     Type: string
#
#   flavor (required)
#     Runner flavor for client library
#     Type: string
#
#   namespace (optional)
#     Namespace used by the C++ library.
#     Type: string
#
#   deps (optional)
#   metadata (optional)
#   output_name (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
template("cpp_config_client_lib_source") {
  assert(defined(invoker.compiled_manifest),
         "the path to a compiled component manifest must be specified")
  assert(defined(invoker.fidl_library_name),
         "the name of the internal FIDL library must be specified")
  assert(defined(invoker.flavor),
         "the flavor of the FIDL library must be specified ('elf' or 'driver')")
  if (defined(invoker.namespace)) {
    namespace = invoker.namespace
  } else {
    namespace = target_name
  }
  compiled_manifest = invoker.compiled_manifest

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "name",
                             "testonly",
                             "visibility",
                           ])

    tool = "//tools/configc"
    tool_output_name = "configc"

    inputs = [
      compiled_manifest,
      "${clang_prefix}/clang-format",
    ]

    cc_source_file_path = "${target_out_dir}/${namespace}.cc"
    h_source_file_path = "${target_out_dir}/${namespace}.h"

    args = [
      "cpp",
      "--cm",
      rebase_path(compiled_manifest, root_build_dir),
      "--h-output",
      rebase_path(h_source_file_path, root_build_dir),
      "--cc-output",
      rebase_path(cc_source_file_path, root_build_dir),
      "--namespace",
      namespace,
      "--fidl-library-name",
      invoker.fidl_library_name,
      "--clang-format",
      "${rebased_clang_prefix}/clang-format",
      "--flavor",
      invoker.flavor,
    ]

    outputs = [
      cc_source_file_path,
      h_source_file_path,
    ]

    metadata = {
      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }
      generated_sources = rebase_path(outputs, root_build_dir)
    }
  }
}

# Validate a package's components' configuration (if any).
#
# Parameters
#
#   package_manifest (path)
#     Path to the output of the `pm_build()` template.
#
#   deps (optional)
#   metadata (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
template("validate_packaged_config") {
  assert(defined(invoker.package_manifest), "must provide an input manifest")
  _package_manifest = invoker.package_manifest
  _meta_far = get_path_info(_package_manifest, "dir") + "/meta.far"
  _stamp = "${target_out_dir}/${target_name}.configc.stamp"
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "metadata",
                             "testonly",
                             "visibility",
                           ])

    tool = "//tools/configc"
    tool_output_name = "configc"

    inputs = [
      _package_manifest,
      _meta_far,
    ]
    outputs = [ _stamp ]

    args = [
      "validate-package",
      rebase_path(_package_manifest, root_build_dir),
      "--stamp",
      rebase_path(_stamp, root_build_dir),
    ]
  }
}

# Dump a component's structured configuration values into human-readable JSON.
#
# Parameters
#
#  cm (path)
#    Path to the output of the `cm` or `fuchsia_component_manifest` templates.
#
#  cvf (path)
#    Path to the output of the `cvf` or `fuchsia_structured_config_values` templates.
#
#  output (path)
#    Path to which to write the human-readable values.
#
#  deps (optional)
#  metadata (optional)
#  testonly (optional)
#  visibility (optional)
template("dump_structured_config") {
  assert(defined(invoker.cm),
         "must define `cm` as a path to a compiled manifest")
  assert(defined(invoker.cvf), "must define `cvf` as a path to a values file")
  assert(defined(invoker.output),
         "must provide an `output` path for dumped json")

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "metadata",
                             "testonly",
                             "visibility",
                           ])

    tool = "//tools/configc"
    tool_output_name = "configc"

    inputs = [
      invoker.cm,
      invoker.cvf,
    ]
    outputs = [ invoker.output ]

    args = [
      "dump-values",
      "--cm",
      rebase_path(invoker.cm, root_build_dir),
      "--cvf",
      rebase_path(invoker.cvf, root_build_dir),
      "--output",
      rebase_path(invoker.output, root_build_dir),
    ]
  }
}
