# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

"""Utility for generating TS code with string replacement."""

load("@build_bazel_rules_nodejs//:providers.bzl", "run_node")

def _template_replacement_impl(ctx):
    output_file = ctx.actions.declare_file(ctx.attr.output_file)
    descriptor_data = ctx.files.descriptor_data[0]
    template_file = ctx.files.template_file[0]

    run_node(
        ctx,
        executable = "_template_replacement_bin",
        inputs = [descriptor_data, template_file],
        outputs = [output_file],
        arguments = [
            "--template",
            template_file.path,
            "--descriptor_data",
            descriptor_data.path,
            "--output",
            output_file.path,
            "--proto_root_dir",
            ctx.attr.proto_root_dir,
        ],
    )

    return [DefaultInfo(files = depset([output_file]))]

template_replacement = rule(
    implementation = _template_replacement_impl,
    attrs = {
        "_template_replacement_bin": attr.label(
            executable = True,
            cfg = "exec",
            default = Label("@//pw_protobuf_compiler/ts/codegen:template_replacement_bin"),
        ),
        "descriptor_data": attr.label(
            allow_files = [".proto.bin"],
        ),
        "proto_root_dir": attr.string(mandatory = True),
        "output_file": attr.string(mandatory = True),
        "template_file": attr.label(
            allow_files = [".ts"],
            default = Label("@//pw_protobuf_compiler/ts:ts_proto_collection_template"),
        ),
    },
)