# Copyright 2023 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/dist/resource.gni")
import("config.gni")  # icu_flavors, icu_flavor_major_versions

# A placeholder for major version number. If this string appears in any
# `outputs`, it will be replaced with the current flavor's major version
# number, such as "73".
icu_major_version_number_placeholder = "||icu_major_version_number||"

# An ICU-aware resource.
#
# All args are forwarded verbatim from `resource`.
#
# In the `outputs`, use `${icu_major_version_number_placeholder}` to substitute
# the actual major version number of the respective ICU flavor, such as 73.
#
# Refer to icu_source_set.gni for detailed comments on some constructs below,
# the ideas of which are commonly reused in all icu_* templates.
template("icu_resource") {
  foreach(icu_flavor, icu_flavors) {
    _flavored_resource_name =
        "${target_name}.icu_${icu_flavor.name}_${icu_flavor.commit_id}"
    resource(_flavored_resource_name) {
      forward_variables_from(invoker,
                             "*",
                             [
                               "target_name",  # Workaround for
                                               # https://fxbug.dev/42083609.
                               "testonly",
                               "visibility",
                             ])
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])

      foreach(source, sources) {
        sources -= [ source ]
        sources += [ string_replace(source,
                                    icu_root,
                                    "//third_party/icu/${icu_flavor.name}") ]
      }
      foreach(output, outputs) {
        outputs -= [ output ]
        outputs += [ string_replace(output,
                                    icu_major_version_number_placeholder,
                                    icu_flavor.major_version) ]
      }
    }
  }

  resource(target_name) {
    forward_variables_from(invoker, "*")
    foreach(output, outputs) {
      outputs -= [ output ]
      outputs += [ string_replace(output,
                                  icu_major_version_number_placeholder,
                                  icu_flavor_major_versions.default) ]
    }
  }
}
