# Copyright 2019 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/host.gni")
import("//build/rust/rustc_binary.gni")
import("//build/rust/rustc_test.gni")
import("//build/test/test_package.gni")
import("//build/testing/host_test_data.gni")

if (host_toolchain == current_toolchain) {
  common_sources = [
    "src/fidljson.rs",
    "src/main.rs",
    "src/simple_logger.rs",
    "src/templates/html/mod.rs",
    "src/templates/markdown/mod.rs",
    "src/templates/mod.rs",
  ]

  common_inputs = [
    "src/templates/markdown/partials/header.hbs",
    "src/templates/markdown/partials/types/filename.hbs",
    "src/templates/html/interface.hbs",
    "src/templates/markdown/interface.hbs",
    "src/templates/markdown/partials/header_dir.hbs",
    "src/templates/markdown/partials/declarations/tables.hbs",
    "src/templates/markdown/partials/declarations/enums.hbs",
    "src/templates/markdown/partials/types/vector.hbs",
    "src/templates/markdown/partials/declarations/constants.hbs",
    "src/templates/html/main.hbs",
    "src/templates/markdown/partials/declarations/type_aliases.hbs",
    "src/templates/markdown/partials/declarations/protocols.hbs",
    "src/templates/markdown/partials/types/doc.hbs",
    "src/templates/markdown/partials/footer.hbs",
    "src/templates/markdown/partials/declarations/bits.hbs",
    "src/templates/markdown/partials/declarations/unions.hbs",
    "src/templates/markdown/main.hbs",
    "src/templates/markdown/toc.hbs",
    "src/templates/markdown/partials/types/type.hbs",
    "src/templates/markdown/partials/declarations/structs.hbs",
  ]

  rustc_binary("fidldoc_bin") {
    name = "fidldoc"
    edition = "2018"
    deps = [ ":rust_crates" ]

    sources = common_sources

    inputs = common_inputs
  }

  copy("fidldoc_copy_config") {
    sources = [ "src/fidldoc.config.json" ]
    outputs = [ "${host_tools_dir}/fidldoc.config.json" ]
  }

  rustc_test("fidldoc_bin_test") {
    source_root = "src/main.rs"
    deps = [
      ":fidldoc_bin",
      ":rust_crates",
    ]
    non_rust_deps = [
      ":copy_jsonir_goldens",
      ":copy_markdown_goldens",
    ]

    sources = common_sources

    inputs = common_inputs + [
               "src/templates/markdown/testdata/README.md",
               "src/templates/markdown/testdata/_toc.yaml",
               "src/fidldoc.config.json",
             ]
  }

  host_test_data("copy_jsonir_goldens") {
    sources =
        rebase_path(read_file("//zircon/tools/fidl/goldens/jsonir_goldens.txt",
                              "list lines"),
                    ".",
                    "//zircon/tools/fidl/goldens/")
    outputs = [ "$root_out_dir/test_data/fidldoc/{{source_name_part}}.golden" ]
  }

  # Markdown goldens have the same filename as JSON IR goldens with a ".md" extension
  host_test_data("copy_markdown_goldens") {
    exec_script("markdown_goldens.py",
                [
                  "--input",
                  rebase_path("//zircon/tools/fidl/goldens/jsonir_goldens.txt"),
                  "--goldens",
                  rebase_path("src/templates/markdown/testdata/"),
                ])
    sources = []
    foreach(jsonir,
            read_file("//zircon/tools/fidl/goldens/jsonir_goldens.txt",
                      "list lines")) {
      sources += [ rebase_path(jsonir + ".md",
                               ".",
                               "src/templates/markdown/testdata/") ]
    }
    outputs = [ "$root_out_dir/test_data/fidldoc/{{source_name_part}}.md" ]
  }

  group("rust_crates") {
    deps = [
      "//third_party/rust_crates:anyhow",
      "//third_party/rust_crates:argh",
      "//third_party/rust_crates:glob",
      "//third_party/rust_crates:handlebars",
      "//third_party/rust_crates:lazy_static",
      "//third_party/rust_crates:log",
      "//third_party/rust_crates:pulldown-cmark",
      "//third_party/rust_crates:rayon",
      "//third_party/rust_crates:regex",
      "//third_party/rust_crates:serde",
      "//third_party/rust_crates:serde_json",
      "//third_party/rust_crates:tempfile",
    ]
  }
}

install_host_tools("fidldoc") {
  deps = [
    ":fidldoc_bin($host_toolchain)",
    ":fidldoc_copy_config($host_toolchain)",
  ]

  outputs = [ "fidldoc" ]
}

group("tests") {
  testonly = true

  deps = [ ":fidldoc_bin_test($host_toolchain)" ]
}
