# 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/config.gni")
import("//build/json/validate_json.gni")

# Validates a factory store provider configuration file against a schema.
#
# Parameters
#   config (required)
#     This is a factory store provider config file that needs to be validated.
template("factory_store_provider_config_validate") {
  validate_json(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    data = invoker.config
    schema = "//src/factory/factory_store_provider_config_schema.json"
  }
}

# Packages a factory store provider configuration after validating it.
#
# Parameters
#   config (required)
#     A file containing a configuration for a factory store provider.
#     It will be schema-validated.
#   provider (required)
#     The factory store provider protocol that the given config maps to.
#     Must be one of the following:
#       fuchsia.factory.CastCredentialsFactoryStoreProvider
#       fuchsia.factory.MiscFactoryStoreProvider
#       fuchsia.factory.PlayReadyFactoryStoreProvider
#       fuchsia.factory.WidevineFactoryStoreProvider
template("factory_store_provider_config") {
  validate_target = target_name + "_${invoker.provider}_validate"

  factory_store_provider_config_validate(validate_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])

    config = invoker.config
  }

  config_data(target_name) {
    for_pkg = "factory_store_providers"
    sources = [ rebase_path(invoker.config) ]

    outputs = [ "${invoker.provider}.config" ]

    deps = [ ":${validate_target}" ]
  }
}

# Validates a factory store provider factory source configuration file.
#
# Parameters
#   config (required)
#     This is a factory store provider config file that needs to be validated.
template("factory_store_provider_factory_config_validate") {
  validate_json(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    data = invoker.config
    schema = "//src/factory/factory_store_provider_factory_config_schema.json"
  }
}

# Packages a factory store provider factory source configuration.
#
# Parameters
#   config (required)
#     A file containing a configuration for a factory store provider.
#     It will be schema-validated.
template("factory_store_provider_factory_config") {
  validate_target = target_name + "_factory_validate"

  factory_store_provider_factory_config_validate(validate_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])

    config = invoker.config
  }

  config_data(target_name) {
    for_pkg = "factory_store_providers"
    sources = [ rebase_path(invoker.config) ]

    outputs = [ "factory.config" ]

    deps = [ ":${validate_target}" ]
  }
}
