# Copyright 2017 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/components.gni")
import("//build/fidl/fidl.gni")
import("//build/rust/rustc_library.gni")
import("//build/rust/rustc_test.gni")

fidl_rust_deps = [
  "//src/lib/fuchsia-async",
  "//src/lib/fuchsia-sync",
  "//src/lib/zircon/rust:fuchsia-zircon-status",
  "//src/lib/zircon/rust:fuchsia-zircon-types",
  "//third_party/rust_crates:bitflags",
  "//third_party/rust_crates:futures",
  "//third_party/rust_crates:slab",
  "//third_party/rust_crates:static_assertions",
  "//third_party/rust_crates:thiserror",
  "//third_party/rust_crates:tracing",
]

if (is_fuchsia) {
  fidl_rust_deps += [ "//src/lib/zircon/rust:fuchsia-zircon" ]
}

fidl_rust_sources = [
  "src/client.rs",
  "src/encoding.rs",
  "src/endpoints.rs",
  "src/epitaph.rs",
  "src/error.rs",
  "src/for_fidl_message_crate.rs",
  "src/handle.rs",
  "src/lib.rs",
  "src/marker.rs",
  "src/persistence.rs",
  "src/prelude.rs",
  "src/server.rs",
]

rustc_library("fidl") {
  edition = "2021"
  deps = fidl_rust_deps
  sources = fidl_rust_sources
}

rustc_test("fidl_rust_lib_tests_bin") {
  output_name = "fidl_rust_lib_tests"
  edition = "2021"
  deps = fidl_rust_deps + [ "//third_party/rust_crates:assert_matches" ]
  if (is_fuchsia) {
    deps += [
      "//third_party/rust_crates:anyhow",
      "//third_party/rust_crates:futures-test",
    ]
  }
  sources = fidl_rust_sources
}

fuchsia_unittest_package("fidl_rust_lib_tests") {
  deps = [ ":fidl_rust_lib_tests_bin" ]
}

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