# Copyright 2022 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.

"""Convenience function to generate a JSON validating script."""

load("//test_utils:py_test_utils.bzl", "PY_TOOLCHAIN_DEPS", "create_python3_shell_wrapper_provider")

# These attributes must be part of any rule() whose implementation
# function wants to call create_validation_script() below. They
# are used to ensure to ensure the function can access the
# paths and runfiles of json_comparator.py and of the python
# interpreter.
CREATE_VALIDATION_SCRIPT_ATTRS = {
    "_json_comparator": attr.label(
        default = "@fuchsia_sdk//fuchsia/tools:json_comparator",
        executable = True,
        cfg = "exec",
    ),
} | PY_TOOLCHAIN_DEPS

def create_validation_script_provider(
        ctx,
        generated,
        golden_file,
        relative_path = None,
        runfiles = None):
    """Create a validation script and its related runfiles object.

    Create a validation script that invokes json_comparator.py to
    verify that a given generated file matches a golden file.

    Args:
      ctx: A rule context object. The corresponding rule definition
         *must* include the content of CREATE_VALIDATION_SCRIPT_ATTRS
         in its `attrs` value.

      generated: a File object pointing to the generated
         file/directory to verify.

      golden_file: a File object pointing to the golden file used
         for verification.

      relative_path: A path relative to generated directory.

      runfiles: an optional runfiles value for extra runtime requirements.

    Returns:
        A DefaultInfo provider for the script and its runtime requirements.
    """
    validator_path = ctx.executable._json_comparator.short_path

    generated_path = generated.short_path
    if relative_path:
        generated_path = generated_path + "/" + relative_path

    validator_args = [
        "--generated={}".format(generated_path),
        "--golden={}".format(golden_file.short_path),
    ]

    validator_runfiles = ctx.runfiles(
        files = [
            golden_file,
            generated,
        ],
    ).merge(
        ctx.attr._json_comparator[DefaultInfo].default_runfiles,
    )
    if runfiles != None:
        validator_runfiles = validator_runfiles.merge(runfiles)

    return create_python3_shell_wrapper_provider(
        ctx,
        validator_path,
        args = validator_args,
        runfiles = validator_runfiles,
    )
