# 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/go/go_library.gni")
import("//build/go/go_test.gni")
import("//build/sdk/sdk_documentation.gni")

# Schemas that are required for the product_bundle_container.
product_bundle_container_required_schemas = [
  "product_bundle_container-76a5c104.json",
  "common.json",
  "product_bundle-6320eef1.json",
  "flash_manifest-835e8f26.json",
  "emu_manifest.json",
]

# This list should only contain schemas that are currently exported outside of
# the Fuchsia source tree.
schemas = [
            # "banjo_library.json",
            "cc_prebuilt_library.json",
            "cc_source_library.json",
            "dart_library.json",
            "data.json",
            "documentation.json",
            "fidl_library.json",
            "hardware-f6f47515.json",
            "host_tool.json",
            "loadable_module.json",
            "manifest.json",
            "physical_device-0bd5d21f.json",
            "sysroot.json",
            "version_history-038fa854.json",
            "virtual_device-93A41932.json",
          ] + product_bundle_container_required_schemas

sdk_documentation("meta") {
  name = "metadata_schemas"
  category = "partner"

  files = []
  foreach(schema, schemas) {
    files += [
      {
        source = "//build/sdk/meta/$schema"
        dest = "meta/schemas/$schema"
      },
    ]
  }
}

go_library("go_meta") {
  name = "go.fuchsia.dev/fuchsia/build/sdk/meta"
  deps = [
    "//third_party/golibs:github.com/xeipuuv/gojsonschema",
    "//third_party/golibs:go.uber.org/multierr",
    "//tools/artifactory:lib",
  ]
  sources = [
              "product_bundle_container.go",
              "product_bundle_container_test.go",
            ] + product_bundle_container_required_schemas
}

go_test("go_meta_tests") {
  gopackages = [ "go.fuchsia.dev/fuchsia/build/sdk/meta" ]
  deps = [
    ":go_meta",
    "//third_party/golibs:github.com/google/go-cmp",
    "//third_party/golibs:go.uber.org/multierr",
  ]
}

source_set("schemas") {
  inputs = schemas
}

if (is_host) {
  import("//build/rust/rustc_library.gni")

  rustc_library("rust") {
    name = "sdk_metadata"

    with_unit_tests = true

    edition = "2018"

    deps = [
      "//third_party/rust_crates:anyhow",
      "//third_party/rust_crates:lazy_static",
      "//third_party/rust_crates:serde",
      "//third_party/rust_crates:serde_json",
      "//third_party/rust_crates:thiserror",
      "//third_party/rust_crates:url-v1_7_2",
      "//third_party/rust_crates:valico",
    ]

    non_rust_deps = [ ":schemas" ]

    sources = [
      "src/banjo_library.rs",
      "src/cc_prebuilt_library.rs",
      "src/cc_source_library.rs",
      "src/common.rs",
      "src/dart_library.rs",
      "src/data.rs",
      "src/documentation.rs",
      "src/fidl_library.rs",
      "src/host_tool.rs",
      "src/json.rs",
      "src/lib.rs",
      "src/loadable_module.rs",
      "src/manifest.rs",
      "src/metadata.rs",
      "src/physical_device.rs",
      "src/product_bundle.rs",
      "src/sysroot.rs",
      "src/testing.rs",
      "src/virtual_device.rs",
    ]

    inputs = [
      "banjo_library.json",
      "cc_prebuilt_library.json",
      "cc_source_library.json",
      "common.json",
      "dart_library.json",
      "data.json",
      "documentation.json",
      "emu_manifest.json",
      "fidl_library.json",
      "flash_manifest-835e8f26.json",
      "hardware-f6f47515.json",
      "host_tool.json",
      "loadable_module.json",
      "manifest.json",
      "physical_device-0bd5d21f.json",
      "product_bundle-6320eef1.json",
      "sysroot.json",
      "virtual_device-93A41932.json",
    ]
  }
}

group("tests") {
  testonly = true
  deps = [
    ":go_meta_tests($host_toolchain)",
    ":rust_test($host_toolchain)",
  ]
}
