# 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/compiled_action.gni")
import("//build/go/go_library.gni")

# Declares a go library composed of copied and generated files.
#
# Parameters
#  definitions(required) list of definitions to generate templates, in the form:
#    {
#      # JSON file applied to the template.
#      src = "my_definition.json"
#      # Destination package in the generated library.
#      package = "eth"
#      # Path to template definition.
#      template = "my_template.tmpl"
#      # copy support files to destination package.
#      copy = [ "my_support_file.go" ]
#    },
#
#  name, deps, public_deps(optional) forwarded to go_library
template("generated_go") {
  gen_files = []
  gen_names = []

  assert(defined(invoker.definitions), "missing template definitions")

  foreach(f, invoker.definitions) {
    assert(defined(f.template), "missing template path for generation")
    assert(defined(f.package), "missing destination package for generation")
    assert(defined(f.src), "missing source JSON path for generation")

    pkg_label = string_replace(f.package, "/", "_")

    # Name of the source JSON file will be the name of the generated go file.
    dst_name = get_path_info(f.src, "name")

    # Define a target name for each definition, the generated library will
    # depend on all the actions we declare.
    name = "_${target_name}_${pkg_label}_${dst_name}"

    copy_deps = []
    if (defined(f.copy)) {
      foreach(c, f.copy) {
        # Name of the source file to copy.
        fname = get_path_info(c, "name")

        # Name with extension of the source file.
        file = get_path_info(c, "file")

        # Declare a target name for the copy target, the compiled_action target
        # will depend on all copied files.
        copy_name = "${name}_$fname"
        copy_deps += [ ":$copy_name" ]

        # The copied file is part of the library, add it to the list of
        # generated files.
        gen_files += [ "${f.package}/$file" ]
        copy(copy_name) {
          sources = [ c ]
          outputs = [ "$target_gen_dir/${f.package}/$file" ]
        }
      }
    }

    # The generated file is in the specified package and uses the source JSON
    # name.
    gen_file = "${f.package}/${dst_name}.go"

    # The file will be generated in target_gen_dir.
    gen_dst = "$target_gen_dir/$gen_file"

    # Keep all the generated files and their target labels, the generated
    # library will depend on them.
    gen_files += [ gen_file ]
    gen_names += [ ":$name" ]

    compiled_action(name) {
      tool = "//src/connectivity/network/netstack/gentool"
      sources = [
        f.template,
        f.src,
      ]
      inputs = [
        f.template,
        f.src,
      ]
      outputs = [ gen_dst ]

      args = [
        rebase_path(f.template),
        rebase_path(gen_dst, root_build_dir),
        rebase_path(f.src),
      ]

      deps = copy_deps
    }
  }

  go_library(target_name) {
    if (defined(invoker.name)) {
      name = invoker.name
    } else {
      name = target_name
    }

    # Depend on all the compiled_actions above.
    non_go_deps = gen_names
    source_dir = target_gen_dir

    # Specify each of the files composing the library.
    sources = gen_files
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                           ])
  }
}
