# 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 their 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}",
    ]
  }
}
