# 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/rust/rustc_library.gni")
import("//build/tools/json_merge/json_merge.gni")
import("command.gni")
import("plugins.gni")

# Defines a FFX plugin
#
# Parameters
#
#   name
#     Name of the crate as defined in its manifest file. If not specified, it is
#     assumed to be the same as the target name. All dashes will be replaced
#     with underscores in the library name: <name_underscored>. This
#     target creates two libraries: one for the plugin callback method
#     and one for the argh command struct needed for CLI params. The
#     libraries creates will be <target>_lib and <target>_args_lib.
#     If the `with_unit_tests` flag is used, additional test libraries
#     will be created for a total of four libraries: <target>_lib,
#     <target>_lib_test, <target>_args_lib, <target>_args_lib_test.
#
#   version
#     Semver version of the crate as seen on crates.io.
#
#   edition (optional)
#     Edition of the Rust language to be used.
#     Options are "2015" and "2018". Defaults to "2018".
#
#   configs (optional)
#     A list of config labels applying to this target.
#
#   deps (optional)
#     List of rust_library GN targets on which this crate depends.
#     Third party crates can be included through paths like
#     "//third_party/rust_crates:<cratename>",
#
#   test_deps (optional)
#     List of rust_library GN targets on which this crate's tests depend.
#
#   with_unit_tests (optional)
#     Builds unit tests associated with the library. This will create a
#     `<name>_lib_test` test file in the output directory. Equivalent
#     to adding a `rustc_test` target with that name and the same source_root.
#
#   args_with_unit_tests (optional)
#     Builds unit tests associated with the args library. This will create a
#     `<name>_args_lib_test` test file in the output directory. Equivalent
#     to adding a `rustc_test` target with that name and the same source_root.
#
#   test_environments (optional)
#     What environments unit tests, if provided, should target. Only used here
#     for linux and mac tests, with a default value of a general linux/mac
#     environment (as a function of $current_os).
#     See environments parameter on //build/testing/test_spec.gni for more
#     details.
#
#   source_root (optional)
#     Location of the plugin root (e.g. `src/lib.rs`). This defaults to `./src/lib.rs`
#     This should be the location of the method marked with the
#     ffx_plugin attribute.
#
#   args_source_root (optional)
#     Location of the plugin's argh command root (e.g. `src/args.rs`). This defaults
#     to `./src/args.rs`. This should be the location of the struct marked with the
#     ffx_command attribute. Due to internal dependencies this cannot
#     be the same file as the source_root.
#
#   features (optional)
#     A list of conditional compilation flags to enable. This can be used to set features for crates
#     built in-tree which are also published to crates.io. This would be passed to rustc as
#     '--cfg feature=XXX'
#
template("ffx_plugin") {
  output_name = target_name
  if (defined(invoker.name)) {
    output_name = invoker.name
  }
  suite_name = output_name + "_suite"
  tests_deps = []

  if (is_host) {
    args_deps = []
    if (defined(invoker.args_deps)) {
      args_deps += invoker.args_deps
    }

    p_deps = []
    json_deps = []
    json_merge_deps = []
    if (defined(invoker.plugin_deps)) {
      foreach(d, invoker.plugin_deps) {
        p_deps += [ d + "_suite" ]
        args_deps += [ d + "_args" ]
        json_deps += [ get_label_info(d, "target_out_dir") + "/config.json" ]
        json_merge_deps += [ get_label_info(d, "dir") + ":config.json" ]
      }

      sub_cmd_gen = output_name + "_sub_command_gen"
      command(sub_cmd_gen) {
        output_name = "cmd_args.rs"
        plugin_deps = invoker.plugin_deps
      }

      sub_cmd = output_name + "_sub_command"
      rustc_library(sub_cmd) {
        source_root = "$target_gen_dir/cmd_args.rs"
        with_unit_tests = false

        sources = [ "$target_gen_dir/cmd_args.rs" ]
        deps = args_deps + [
                 ":" + sub_cmd_gen,
                 "//third_party/rust_crates:argh",
               ]
        forward_variables_from(invoker,
                               "*",
                               [
                                 "name",
                                 "deps",
                                 "args_deps",
                                 "config_data",
                                 "args_source_root",
                                 "source_root",
                                 "sources",
                                 "enforce_source_listing",
                                 "target_name",
                                 "with_unit_tests",
                               ])
      }

      args_deps += [ ":" + sub_cmd ]
    }

    args = output_name + "_args"
    args_source_root = "src/args.rs"
    if (defined(invoker.args_source_root)) {
      args_source_root = invoker.args_source_root
    }

    if (defined(invoker.config_data)) {
      json_deps += invoker.config_data
    } else {
      empty = "$target_out_dir/empty.json"
      write_file(empty,
                 {
                 },
                 "json")
      json_deps += [ empty ]
    }

    json_merge("config.json") {
      sources = json_deps
      deps = json_merge_deps
      minify = true
    }

    rustc_library(args) {
      source_root = args_source_root
      deps = args_deps + [
               "//src/developer/ffx/core:lib",
               "//src/developer/ffx/config:lib",
               "//third_party/rust_crates:anyhow",
               "//third_party/rust_crates:argh",
             ]
      non_rust_deps = [ "//third_party/boringssl" ]
      if (defined(invoker.args_with_unit_tests) &&
          invoker.args_with_unit_tests == true) {
        with_unit_tests = true
      }
      forward_variables_from(invoker,
                             "*",
                             [
                               "name",
                               "config_data",
                               "deps",
                               "source_root",
                               "non_rust_deps",
                               "target_name",
                               "with_unit_tests",
                             ])
    }
    if (defined(invoker.args_with_unit_tests) &&
        invoker.args_with_unit_tests == true) {
      tests_deps += [ ":" + args + "_test" ]
    }

    lib_deps = [
      ":" + args,
      "//sdk/fidl/fuchsia.developer.bridge:fuchsia.developer.bridge-rustc",
      "//sdk/fidl/fuchsia.developer.remotecontrol:fuchsia.developer.remotecontrol-rustc",
      "//src/connectivity/overnet/lib/hoist",
      "//src/developer/ffx/core:lib",
      "//src/developer/ffx/config:lib",
      "//src/diagnostics/lib/selectors",
      "//src/lib/fidl/rust/fidl",
      "//src/lib/fuchsia-async",
      "//third_party/rust_crates:anyhow",
      "//third_party/rust_crates:argh",
      "//third_party/rust_crates:async-std",
      "//third_party/rust_crates:futures",
      "//third_party/rust_crates:log",
    ]

    if (defined(invoker.deps)) {
      lib_deps += invoker.deps
    }

    plugins_name = output_name + "_plugins"
    execution_lib = output_name

    plugin_source_root = "src/lib.rs"
    if (defined(invoker.source_root)) {
      plugin_source_root = invoker.source_root
    }
    includes_execution = false
    if (defined(invoker.sources)) {
      foreach(i, invoker.sources) {
        if (i == plugin_source_root) {
          includes_execution = true
        }
      }
    }

    plugins(plugins_name) {
      output_name = "plugins.rs"
      args = args
      if (defined(invoker.plugin_deps)) {
        sub_command = sub_cmd
      }
      execution_lib = execution_lib
      forward_variables_from(invoker,
                             "*",
                             [
                               "name",
                               "config_data",
                               "output_name",
                               "args",
                             ])
    }

    suite_deps = lib_deps + p_deps
    suite_deps += [
      ":" + args,
      ":" + plugins_name,
    ]
    if (defined(invoker.plugin_deps)) {
      suite_deps += [ ":" + sub_cmd ]
    }

    if (includes_execution) {
      rustc_library(output_name) {
        deps = lib_deps
        non_rust_deps = [ "//third_party/boringssl" ]
        forward_variables_from(invoker,
                               "*",
                               [
                                 "name",
                                 "config_data",
                                 "deps",
                                 "non_rust_deps",
                                 "target_name",
                               ])
      }
      suite_deps += [ ":" + execution_lib ]

      if (defined(invoker.with_unit_tests) && invoker.with_unit_tests == true) {
        tests_deps += [ ":" + output_name + "_test" ]
      }
    }

    rustc_library(suite_name) {
      source_root = "$target_gen_dir/plugins.rs"

      with_unit_tests = false
      sources = [ "$target_gen_dir/plugins.rs" ]
      deps = suite_deps
      non_rust_deps = [ "//third_party/boringssl" ]
      forward_variables_from(invoker,
                             "*",
                             [
                               "name",
                               "config_data",
                               "deps",
                               "non_rust_deps",
                               "target_name",
                               "sources",
                               "enforce_source_listing",
                               "with_unit_tests",
                             ])
    }
  }

  if (defined(invoker.plugin_deps)) {
    foreach(d, invoker.plugin_deps) {
      test = get_label_info(d, "dir")
      test_name = get_label_info(d, "name")
      tests_deps += [ test + ":" + test_name + "_tests" ]
    }
  }

  group(output_name + "_tests") {
    testonly = true
    deps = tests_deps
  }
}
