# Copyright 2018 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/config.gni")
import("//build/rust/rustc_binary.gni")
import("//build/testing/environments.gni")
import("//third_party/cobalt/metrics_registry.gni")

declare_args() {
  # Selects the wlan configuration type to use. Choices:
  #   "client" - client mode
  #   "ap" - access point mode
  #   "" (empty string) - no configuration
  wlancfg_config_type = "client"
}

rustc_binary("bin") {
  name = "wlancfg"
  with_unit_tests = true
  edition = "2018"

  deps = [
    ":wlan_metrics_registry_rustlib",
    "//sdk/fidl/fuchsia.cobalt:fuchsia.cobalt-rustc",
    "//sdk/fidl/fuchsia.location.namedplace:fuchsia.location.namedplace-rustc",
    "//sdk/fidl/fuchsia.location.sensor:fuchsia.location.sensor-rustc",
    "//sdk/fidl/fuchsia.net:fuchsia.net-rustc",
    "//sdk/fidl/fuchsia.stash:fuchsia.stash-rustc",
    "//sdk/fidl/fuchsia.wlan.common:fuchsia.wlan.common-rustc",
    "//sdk/fidl/fuchsia.wlan.device:fuchsia.wlan.device-rustc",
    "//sdk/fidl/fuchsia.wlan.device.service:fuchsia.wlan.device.service-rustc",
    "//sdk/fidl/fuchsia.wlan.ieee80211:fuchsia.wlan.ieee80211-rustc",
    "//sdk/fidl/fuchsia.wlan.internal:fuchsia.wlan.internal-rustc",
    "//sdk/fidl/fuchsia.wlan.policy:fuchsia.wlan.policy-rustc",
    "//sdk/fidl/fuchsia.wlan.product.deprecatedclient:fuchsia.wlan.product.deprecatedclient-rustc",
    "//sdk/fidl/fuchsia.wlan.product.deprecatedconfiguration:fuchsia.wlan.product.deprecatedconfiguration-rustc",
    "//sdk/fidl/fuchsia.wlan.sme:fuchsia.wlan.sme-rustc",
    "//sdk/fidl/fuchsia.wlan.stats:fuchsia.wlan.stats-rustc",
    "//src/connectivity/wlan/lib/common/rust/:wlan-common",
    "//src/connectivity/wlan/lib/inspect:wlan-inspect",
    "//src/connectivity/wlan/lib/stash/:wlan-stash",
    "//src/lib/cobalt/rust:fuchsia-cobalt",
    "//src/lib/diagnostics/inspect/contrib/rust",
    "//src/lib/diagnostics/inspect/rust",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/lib/fuchsia-component",
    "//src/lib/syslog/rust:syslog",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//third_party/cobalt/src/lib/client/rust:cobalt-client",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:async-trait",
    "//third_party/rust_crates:base64",
    "//third_party/rust_crates:eui48",
    "//third_party/rust_crates:futures",
    "//third_party/rust_crates:itertools",
    "//third_party/rust_crates:log",
    "//third_party/rust_crates:maplit",
    "//third_party/rust_crates:parking_lot",
    "//third_party/rust_crates:pin-utils",
    "//third_party/rust_crates:rand",
    "//third_party/rust_crates:serde",
    "//third_party/rust_crates:serde_json",
    "//third_party/rust_crates:tempfile",
    "//third_party/rust_crates:test-case",
    "//third_party/rust_crates:thiserror",
    "//third_party/rust_crates:void",
  ]

  sources = [
    "src/access_point/mod.rs",
    "src/access_point/state_machine.rs",
    "src/access_point/types.rs",
    "src/client/mod.rs",
    "src/client/network_selection.rs",
    "src/client/scan.rs",
    "src/client/state_machine.rs",
    "src/client/types.rs",
    "src/config_management/config_manager.rs",
    "src/config_management/mod.rs",
    "src/config_management/network_config.rs",
    "src/config_management/stash_conversion.rs",
    "src/legacy/deprecated_client.rs",
    "src/legacy/deprecated_configuration.rs",
    "src/legacy/device.rs",
    "src/legacy/known_ess_store.rs",
    "src/legacy/mod.rs",
    "src/main.rs",
    "src/mode_management/iface_manager.rs",
    "src/mode_management/iface_manager_api.rs",
    "src/mode_management/iface_manager_types.rs",
    "src/mode_management/mod.rs",
    "src/mode_management/phy_manager.rs",
    "src/regulatory_manager.rs",
    "src/util/fuse_pending.rs",
    "src/util/future_with_metadata.rs",
    "src/util/listener/access_point.rs",
    "src/util/listener/client.rs",
    "src/util/listener/generic.rs",
    "src/util/listener/mod.rs",
    "src/util/logger.rs",
    "src/util/mod.rs",
    "src/util/sme_conversion.rs",
    "src/util/state_machine.rs",
    "src/util/testing/cobalt.rs",
    "src/util/testing/generate_struct.rs",
    "src/util/testing/mod.rs",
    "src/util/testing/sme_stream.rs",
  ]
}

fuchsia_component("service") {
  component_name = "wlancfg"
  manifest = "meta/wlancfg.cmx"
  deps = [ ":bin" ]
}

fuchsia_package("wlancfg") {
  deps = [ ":service" ]
}

config_data("config") {
  for_pkg = "wlancfg"
  if (wlancfg_config_type == "ap") {
    sources = [ rebase_path("config/ap.json") ]
    outputs = [ "default.json" ]
  } else if (wlancfg_config_type == "client") {
    sources = [ rebase_path("config/client.json") ]
    outputs = [ "default.json" ]
  }
}

fuchsia_unittest_package("wlancfg-tests") {
  manifest = "meta/wlancfg_bin_test.cmx"
  deps = [ ":bin_test" ]
}

metrics_registry("wlan_metrics_registry") {
  # This must match the ID of our Cobalt project as specified in:
  # //third_party/cobalt_config/projects.yaml
  project_id = 3708719327
  generate_rust = true  # Generates a rust target with '_rustlib' appended
}
