# 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/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/go/go_test.gni")
import("//build/host.gni")
import("//build/rust/fidl_rust.gni")
import("//build/rust/toolchain.gni")
import("//build/testing/golden_test.gni")
import("//zircon/tools/fidl/testdata/info.gni")

go_library("gopkg") {
  name = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_rust/..."
  deps = [ "//tools/fidl/lib/fidlgen" ]
  sources = [
    "codegen/bits.tmpl.go",
    "codegen/codegen.go",
    "codegen/const.tmpl.go",
    "codegen/enum.tmpl.go",
    "codegen/handle_metadata_wrappers.tmpl.go",
    "codegen/ir.go",
    "codegen/ir_test.go",
    "codegen/protocol.tmpl.go",
    "codegen/result.tmpl.go",
    "codegen/service.tmpl.go",
    "codegen/sourcefile.tmpl.go",
    "codegen/struct.tmpl.go",
    "codegen/table.tmpl.go",
    "codegen/union.tmpl.go",
    "main.go",
  ]
}

# Invocations of fidlgen_rust in //build/rust/fidl_rust.gni pass the prebuilt
# rustfmt and rustfmt.toml. To avoid bloating ninja files, we artificially place
# dependencies on fidlgen_rust instead of the actions that use fidlgen_rust.
action("rustfmt") {
  script = "//build/fidl/run_and_gen_stamp.sh"
  stamp_file = "$target_gen_dir/rustfmt.stamp"
  args = [ rebase_path(stamp_file, root_build_dir) ]
  outputs = [ stamp_file ]
  inputs = [
    "$fidl_rust_tools_dir/.versions/rust_tools.cipd_version",
    "//rustfmt.toml",
  ]
}

go_binary("fidlgen_rust") {
  gopackage = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_rust"
  sdk_category = "partner"
  deps = [ ":gopkg" ]
  non_go_deps = [ ":rustfmt" ]
}

install_host_tools("host") {
  deps = [ ":fidlgen_rust" ]
  outputs = [ "fidlgen_rust" ]
}

go_test("fidlgen_rust_lib_tests") {
  gopackages = [ "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_rust/codegen" ]
  deps = [
    ":gopkg",
    "//third_party/golibs:github.com/google/go-cmp",
  ]
}

golden_test("fidlgen_rust_golden_tests") {
  goldens_dir = "goldens"
  deps = []
  entries = []
  foreach(info, fidl_testdata_info) {
    if (info.denylist + [ "fidlgen_rust" ] - [ "fidlgen_rust" ] ==
        info.denylist) {
      deps += [ "${info.target}_rust_generate($rust_toolchain)" ]
      library_underscore = string_replace(info.library, ".", "_")
      entries += [
        {
          golden = "${info.name}.rs.golden"
          generated = "${info.fidl_gen_dir}/${info.target_name}/fidl_${library_underscore}.rs"
        },
      ]
    }
  }
}

group("goldens") {
  testonly = true

  denylist_key = "device_build_denylist"
  if (is_host) {
    denylist_key = "host_build_denylist"
  }

  deps = []
  foreach(info, fidl_testdata_info) {
    if (info[denylist_key] + [ "fidlgen_rust" ] - [ "fidlgen_rust" ] ==
        info[denylist_key]) {
      deps += [ "${info.target}-rustc" ]
    }
  }
}

group("tests") {
  testonly = true
  deps = [
    ":fidlgen_rust_golden_tests($host_toolchain)",
    ":fidlgen_rust_lib_tests($host_toolchain)",
    ":goldens",
    ":goldens($host_toolchain)",
  ]
}
