# Copyright (c) 2026 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("//build/config/rust.gni")
import("//build/rust/rust_macro.gni")
import("//build/rust/rust_static_library.gni")
import("//build/rust/rust_unit_test.gni")
import("../../webrtc.gni")

# These provide the base import macros for webrtc, and thus use the templates
# from //build and not webrtc's macros.
if (enable_rust) {
  rust_macro("webrtc_import_macro") {
    crate_name = "import"
    crate_root = "import.rs"
    sources = [
      "import.rs",
      "path_utils.rs",
    ]
    deps = [
      "//third_party/rust/proc_macro2/v1:lib",
      "//third_party/rust/quote/v1:lib",
      "//third_party/rust/syn/v2:lib",
    ]

    # Don't depend on ourselves.
    no_chromium_prelude = true
  }

  rust_static_library("webrtc_import") {
    crate_name = "webrtc"
    crate_root = "lib.rs"
    sources = [ "lib.rs" ]

    deps = [ ":webrtc_import_macro" ]

    # Don't depend on ourselves.
    no_chromium_prelude = true
  }

  if (rtc_include_tests) {
    # Dummy library crate utilized by the standalone macro verification test.
    rust_static_library("webrtc_import_test_lib") {
      testonly = true
      crate_root = "webrtc_import_test_lib.rs"
      sources = [ "webrtc_import_test_lib.rs" ]
    }

    # Native target-platform unit tests for the core path transformation string logic.
    #
    # NOTE: Because `import.rs` is a proc-macro crate that relies on the host compiler's
    # built-in `proc_macro` package, it cannot be native target-tested directly without causing
    # cross-compilation errors or breaking the main `rust_unit_tests_group` script generator.
    # By splitting the string arithmetic out into `path_utils.rs` (which has no proc_macro deps),
    # we can target-compile and run these core rules natively in the automated runner suite.
    rtc_rust_unittest("webrtc_import_utils_unittests") {
      crate_root = "path_utils.rs"
      sources = [ "path_utils.rs" ]
    }

    # Integration test validating the macro expansion behavior in Standalone mode.
    # Confirms that absolute first-party paths are preserved correctly when `WEBRTC_GN_PREFIX = //`.
    rtc_rust_unittest("webrtc_import_test") {
      testonly = true
      crate_root = "webrtc_import_test.rs"
      sources = [ "webrtc_import_test.rs" ]
      deps = [
        ":webrtc_import",
        ":webrtc_import_test_lib",
      ]
      rustenv = [ "WEBRTC_GN_PREFIX=//" ]
    }

    rtc_rust_test_suite("tests") {
      testonly = true
      deps = [
        ":webrtc_import_test",
        ":webrtc_import_utils_unittests",
        "test_subdir:webrtc_import_prefix_test",
      ]
    }
  }
}
