"""Internal transition implementations for core Rust rules""" load("//rust:defs.bzl", "rust_common") def _import_macro_dep_bootstrap_transition(_settings, _attr): """The implementation of the `import_macro_dep_bootstrap_transition` transition. This transition modifies the config to start using the fake macro implementation, so that the macro itself can be bootstrapped without creating a dependency cycle, even while every Rust target has an implicit dependency on the "import" macro (either real or fake). Args: _settings (dict): a dict {String:Object} of all settings declared in the inputs parameter to `transition()`. _attr (dict): A dict of attributes and values of the rule to which the transition is attached. Returns: dict: A dict of new build settings values to apply. """ return {"@rules_rust//rust/settings:use_real_import_macro": False} import_macro_dep_bootstrap_transition = transition( implementation = _import_macro_dep_bootstrap_transition, inputs = [], outputs = ["@rules_rust//rust/settings:use_real_import_macro"], ) def _alias_with_import_macro_bootstrapping_mode_impl(ctx): actual = ctx.attr.actual[0] return [actual[rust_common.crate_info], actual[rust_common.dep_info]] alias_with_import_macro_bootstrapping_mode = rule( implementation = _alias_with_import_macro_bootstrapping_mode_impl, doc = "Alias-like rule to build the `actual` with `use_real_import_macro` setting disabled. Not to be used outside of the import macro bootstrap.", attrs = { # Using `actual` so tooling such as rust analyzer aspect traverses the target. "actual": attr.label( doc = "The target this alias refers to.", cfg = import_macro_dep_bootstrap_transition, mandatory = True, ), "_allowlist_function_transition": attr.label( default = Label("//tools/allowlists/function_transition_allowlist"), ), }, )