# 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/rust/rustc_library.gni")

group("tests") {
  testonly = true
  public_deps = [
    ":term_model_tests",
    ":terminal_tests",
  ]
}

rustc_library("lib") {
  name = "terminal_lib"
  with_unit_tests = true
  edition = "2018"

  deps = [
    "third_party/term-model",
    "//garnet/bin/terminal/third_party/term-model",
    "//sdk/fidl/fuchsia.hardware.pty:fuchsia.hardware.pty-rustc",
    "//sdk/fidl/fuchsia.images:fuchsia.images-rustc",
    "//sdk/fidl/fuchsia.math:fuchsia.math-rustc",
    "//sdk/fidl/fuchsia.ui.app:fuchsia.ui.app-rustc",
    "//sdk/fidl/fuchsia.ui.gfx:fuchsia.ui.gfx-rustc",
    "//sdk/fidl/fuchsia.ui.input:fuchsia.ui.input-rustc",
    "//sdk/fidl/fuchsia.ui.scenic:fuchsia.ui.scenic-rustc",
    "//sdk/fidl/fuchsia.ui.views:fuchsia.ui.views-rustc",
    "//src/lib/cstr",
    "//src/lib/diagnostics/inspect/rust",
    "//src/lib/fdio/rust:fdio",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/lib/fuchsia-component",
    "//src/lib/pty",
    "//src/lib/shared-buffer",
    "//src/lib/trace/rust:trace",
    "//src/lib/trace/rust:trace-provider",
    "//src/lib/ui/carnelian",
    "//src/lib/ui/fuchsia-scenic",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:euclid",
    "//third_party/rust_crates:futures",
    "//third_party/rust_crates:libc",
    "//third_party/rust_crates:log",
    "//third_party/rust_crates:parking_lot",
    "//third_party/rust_crates:thiserror",
  ]

  sources = [
    "src/app.rs",
    "src/key_util.rs",
    "src/lib.rs",
    "src/terminal_view.rs",
    "src/ui/mod.rs",
    "src/ui/terminal_scene.rs",
    "src/ui/terminal_views.rs",
  ]

  inputs = [ "//prebuilt/third_party/fonts/robotomono/RobotoMono-Regular.ttf" ]
}

rustc_binary("bin") {
  name = "terminal"
  edition = "2018"
  source_root = "src/bin/terminal.rs"
  with_unit_tests = true

  deps = [
    ":lib",
    "//src/lib/syslog/rust:syslog",
    "//src/lib/trace/rust:trace-provider",
    "//src/lib/ui/carnelian",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:thiserror",
  ]

  sources = [ "src/bin/terminal.rs" ]
}

fuchsia_package_with_single_component("terminal") {
  manifest = "meta/terminal.cmx"
  deps = [ ":bin" ]
}

config_data("tiles_config") {
  for_pkg = "sysmgr"
  sources = [ "config/tiles.config" ]
}

fuchsia_test_component("terminal_tests_component") {
  component_name = "terminal_tests"
  manifest = "meta/terminal_tests.cmx"
  deps = [
    ":lib_test",
    "//src/lib/zircon/rust:exit_with_code_util",
    "//zircon/third_party/uapp/dash",
  ]
}

fuchsia_test_package("terminal_tests") {
  test_components = [ ":terminal_tests_component" ]
}

fuchsia_test_component("term_model_tests_component") {
  component_name = "term_model_tests"
  manifest = "meta/term_model_lib_test.cmx"
  deps = [ "third_party/term-model:term-model_test" ]
}

fuchsia_test_package("term_model_tests") {
  test_components = [ ":term_model_tests_component" ]
}
