# Copyright 2022 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.

# This file was generated by the `fx create` command. The template
# is located at `//tools/create/templates/component-default/BUILD.gn.tmpl-rust`.

import("//build/components.gni")
import("//build/rust/rustc_binary.gni")
import("//src/sys/core/build/core_shard.gni")

group("progress-ui") {
  deps = [ ":package" ]
}

rustc_binary("bin") {
  output_name = "progress-ui"
  edition = "2018"

  # Generates a GN target for unit-tests with the label `bin_test`, and
  # a binary named `progress_ui_bin_test`.
  with_unit_tests = false

  deps = [
    "//sdk/fidl/fuchsia.recovery.ui:fuchsia.recovery.ui-rustc",
    "//src/graphics/lib/compute/rive-rs",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia",
    "//src/lib/fuchsia-async",
    "//src/lib/syslog/rust:syslog",
    "//src/lib/ui/carnelian",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//src/recovery/lib/recovery-util",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:euclid",
    "//third_party/rust_crates:futures",
  ]
  sources = [ "src/main.rs" ]
}

fuchsia_component("component") {
  component_name = "progress_ui"
  manifest = "meta/progress_ui.cml"
  deps = [ ":bin" ]
}

fuchsia_package("package") {
  package_name = "progress-ui"
  deps = [
    ":component",
    "//src/recovery/system:recovery_logo",
    "//src/recovery/system:roboto_regular",
  ]
}

# The core realm shard to be used by example users
core_shard("progress-ui-core-shard") {
  shard_file = "meta/progress_ui.core_shard.cml"
}
