# 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/testing/host_test_data.gni")
import("//zircon/tools/fidl/testdata/targets.gni")

go_library("gopkg") {
  name = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_rust/..."
  deps = [
    "//garnet/go/src/fidl/compiler/backend/common",
    "//garnet/go/src/fidl/compiler/backend/types",
  ]
  sources = [
    "codegen/bits.tmpl.go",
    "codegen/codegen.go",
    "codegen/codegen_test.go",
    "codegen/const.tmpl.go",
    "codegen/enum.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",
  ]
}

go_binary("fidlgen_rust") {
  gopackage = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_rust"

  sdk_category = "partner"
  deps = [ ":gopkg" ]
}

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

if (is_host) {
  go_test("fidlgen_rust_test") {
    gopackages = [ "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_rust/codegen" ]
    args = [
      "--test_data_dir",
      rebase_path("$root_out_dir/test_data/fidlgen", root_build_dir),
      "--rustfmt",
      rebase_path("$root_out_dir/test_data/fidlgen_rust", root_build_dir),
      "--rustfmt-toml",
      rebase_path("$root_out_dir/test_data/fidlgen_rust/rustfmt.toml",
                  root_build_dir),
    ]
    deps = [
      ":gopkg",
      "//garnet/go/src/fidl/compiler/backend/typestest",
    ]
    non_go_deps = [ ":rustfmt" ]
  }

  host_test_data("rustfmt") {
    sources = [
      "//prebuilt/third_party/rust_tools/$host_platform/bin/rustfmt",
      "//rustfmt.toml",
    ]
    outputs = [ "$root_out_dir/test_data/fidlgen_rust/{{source_file_part}}" ]
  }
}

group("goldens") {
  testonly = true

  denylist = [
    # TODO(fxbug.dev/52276): Support arrays of all sizes in Rust.
    "//zircon/tools/fidl/testdata:fidl.test.arrays",

    # TODO(fxbug.dev/62520): Insert enum/bits <-> primitive conversions.
    "//zircon/tools/fidl/testdata:fidl.test.consts",

    # TODO(fxbug.dev/62524): Fix Ord/Hash trait issue with fidl::Resource.
    "//zircon/tools/fidl/testdata:fidl.test.handles",
  ]

  deps = []
  foreach(target, fidl_testdata_targets - denylist) {
    deps += [ "${target}-rustc" ]
  }
}

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