# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Template to generate a dart embedder package.
# Required invoker inputs:
#   String package (relative path to package e.g. mojo/public/interfaces/application)
template("dart_embedder_package") {
  package = invoker.package
  package_path = "//$package"

  destination = package
  if (defined(invoker.destination)) {
    destination = invoker.destination
  }

  action_foreach(target_name) {
    deps = [
      package_path,
    ]
    list_generated_bindings_script =
        rebase_path(
            "//mojo/dart/embedder/tools/dart_list_generated_bindings.py")
    root_prefix = rebase_path("//")
    source_directory = rebase_path(package_path)

    arguments = [
      source_directory,
      root_prefix,
    ]
    if (defined(invoker.is_bindings_types) && invoker.is_bindings_types) {
      arguments += [ "--bindings-types" ]
    }

    generated_bindings =
        exec_script(list_generated_bindings_script, arguments, "list lines")
    sources = rebase_path(generated_bindings, ".", root_gen_dir)
    outputs = [
      "$root_gen_dir/dart_embedder_packages/$destination/{{source_file_part}}",
    ]
    script = rebase_path(
            "//mojo/dart/embedder/tools/dart_rewrite_embedder_package_imports.py")
    args = [
      rebase_path("{{source}}", "", root_build_dir),
      rebase_path(
          "$root_gen_dir/dart_embedder_packages/$destination/{{source_file_part}}"),
    ]
  }
}

# Template to generate a dart embedder resource.cc file.
# Required invoker inputs:
#   String output (name of output file)
#   List inputs (list of input files to be included)
#   String table_name (name of symbol for resource table)
#   String root_prefix (base directory of resources)
# Optional invoker inputs:
#   String input_directory (directory of resources that are recursively added)
#   List deps
#   List datadeps
template("dart_embedder_resources") {
  action(target_name) {
    script = "//dart/runtime/tools/create_resources.py"
    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    datadeps = []
    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }

    output = invoker.output
    outputs = [
      output,
    ]

    inputs = [ script ] + invoker.inputs

    root_prefix = rebase_path(invoker.root_prefix)

    args = [
      "--output",
      rebase_path(output),
      "--outer_namespace",
      "mojo",
      "--inner_namespace",
      "dart",
      "--table_name",
      invoker.table_name,
      "--root_prefix",
      root_prefix,
    ]
    if (defined(invoker.input_directory)) {
      args += [
        "--client_root",
        rebase_path(invoker.input_directory),
      ]
    }
    args += rebase_path(invoker.inputs)
  }
}
