Update `rust_library_group` to use `DepVariantInfo` (#2022)

* Update rust_library_group to use DepVariantInfo

* Regenerate documentation
diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel
index 6c55c0c..2a37518 100644
--- a/docs/BUILD.bazel
+++ b/docs/BUILD.bazel
@@ -49,6 +49,7 @@
         symbols = [
             "rust_binary",
             "rust_library",
+            "rust_library_group",
             "rust_static_library",
             "rust_shared_library",
             "rust_proc_macro",
diff --git a/docs/defs.md b/docs/defs.md
index 5ab97ba..ce622ea 100644
--- a/docs/defs.md
+++ b/docs/defs.md
@@ -3,6 +3,7 @@
 
 * [rust_binary](#rust_binary)
 * [rust_library](#rust_library)
+* [rust_library_group](#rust_library_group)
 * [rust_static_library](#rust_static_library)
 * [rust_shared_library](#rust_shared_library)
 * [rust_proc_macro](#rust_proc_macro)
@@ -308,6 +309,57 @@
 | <a id="rust_library-version"></a>version |  A version to inject in the cargo environment variable.   | String | optional | <code>"0.0.0"</code> |
 
 
+<a id="rust_library_group"></a>
+
+## rust_library_group
+
+<pre>
+rust_library_group(<a href="#rust_library_group-name">name</a>, <a href="#rust_library_group-deps">deps</a>)
+</pre>
+
+Functions as an alias for a set of dependencies.
+
+Specifically, the following are equivalent:
+
+```starlark
+rust_library_group(
+    name = "crate_group",
+    deps = [
+        ":crate1",
+        ":crate2",
+    ],
+)
+
+rust_library(
+    name = "foobar",
+    deps = [":crate_group"],
+    ...
+)
+```
+
+and
+
+```starlark
+rust_library(
+    name = "foobar",
+    deps = [
+        ":crate1",
+        ":crate2",
+    ],
+    ...
+)
+```
+
+
+**ATTRIBUTES**
+
+
+| Name  | Description | Type | Mandatory | Default |
+| :------------- | :------------- | :------------- | :------------- | :------------- |
+| <a id="rust_library_group-name"></a>name |  A unique name for this target.   | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required |  |
+| <a id="rust_library_group-deps"></a>deps |  Other dependencies to forward through this crate group.   | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | <code>[]</code> |
+
+
 <a id="rust_proc_macro"></a>
 
 ## rust_proc_macro
diff --git a/docs/flatten.md b/docs/flatten.md
index 4a9941f..2af15c9 100644
--- a/docs/flatten.md
+++ b/docs/flatten.md
@@ -29,6 +29,7 @@
 * [rust_doc_test](#rust_doc_test)
 * [rust_grpc_library](#rust_grpc_library)
 * [rust_library](#rust_library)
+* [rust_library_group](#rust_library_group)
 * [rust_proc_macro](#rust_proc_macro)
 * [rust_proto_library](#rust_proto_library)
 * [rust_proto_repositories](#rust_proto_repositories)
@@ -731,6 +732,57 @@
 | <a id="rust_library-version"></a>version |  A version to inject in the cargo environment variable.   | String | optional | <code>"0.0.0"</code> |
 
 
+<a id="rust_library_group"></a>
+
+## rust_library_group
+
+<pre>
+rust_library_group(<a href="#rust_library_group-name">name</a>, <a href="#rust_library_group-deps">deps</a>)
+</pre>
+
+Functions as an alias for a set of dependencies.
+
+Specifically, the following are equivalent:
+
+```starlark
+rust_library_group(
+    name = "crate_group",
+    deps = [
+        ":crate1",
+        ":crate2",
+    ],
+)
+
+rust_library(
+    name = "foobar",
+    deps = [":crate_group"],
+    ...
+)
+```
+
+and
+
+```starlark
+rust_library(
+    name = "foobar",
+    deps = [
+        ":crate1",
+        ":crate2",
+    ],
+    ...
+)
+```
+
+
+**ATTRIBUTES**
+
+
+| Name  | Description | Type | Mandatory | Default |
+| :------------- | :------------- | :------------- | :------------- | :------------- |
+| <a id="rust_library_group-name"></a>name |  A unique name for this target.   | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required |  |
+| <a id="rust_library_group-deps"></a>deps |  Other dependencies to forward through this crate group.   | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | <code>[]</code> |
+
+
 <a id="rust_proc_macro"></a>
 
 ## rust_proc_macro
diff --git a/docs/symbols.bzl b/docs/symbols.bzl
index c5aa922..9a7e761 100644
--- a/docs/symbols.bzl
+++ b/docs/symbols.bzl
@@ -57,6 +57,7 @@
     _rust_doc = "rust_doc",
     _rust_doc_test = "rust_doc_test",
     _rust_library = "rust_library",
+    _rust_library_group = "rust_library_group",
     _rust_proc_macro = "rust_proc_macro",
     _rust_shared_library = "rust_shared_library",
     _rust_static_library = "rust_static_library",
@@ -112,6 +113,7 @@
 
 rust_binary = _rust_binary
 rust_library = _rust_library
+rust_library_group = _rust_library_group
 rust_static_library = _rust_static_library
 rust_shared_library = _rust_shared_library
 rust_proc_macro = _rust_proc_macro
diff --git a/rust/private/common.bzl b/rust/private/common.bzl
index 63eb157..f6063a0 100644
--- a/rust/private/common.bzl
+++ b/rust/private/common.bzl
@@ -23,7 +23,7 @@
 In the Bazel lingo, `rust_common` gives the access to the Rust Sandwich API.
 """
 
-load(":providers.bzl", "CrateGroupInfo", "CrateInfo", "DepInfo", "StdLibInfo", "TestCrateInfo")
+load(":providers.bzl", "CrateGroupInfo", "CrateInfo", "DepInfo", "DepVariantInfo", "StdLibInfo", "TestCrateInfo")
 
 # This constant only represents the default value for attributes and macros
 # defined in `rules_rust`. Like any attribute public attribute, it can be
@@ -59,6 +59,7 @@
     create_crate_info = _create_crate_info,
     crate_info = CrateInfo,
     dep_info = DepInfo,
+    dep_variant_info = DepVariantInfo,
     stdlib_info = StdLibInfo,
     test_crate_info = TestCrateInfo,
     crate_group_info = CrateGroupInfo,
diff --git a/rust/private/providers.bzl b/rust/private/providers.bzl
index fbcbcec..b26cc67 100644
--- a/rust/private/providers.bzl
+++ b/rust/private/providers.bzl
@@ -60,8 +60,7 @@
 CrateGroupInfo = provider(
     doc = "A provider containing a group of crates.",
     fields = {
-        "crate_infos": "List[CrateInfo]",
-        "dep_infos": "List[DepInfo]",
+        "dep_variant_infos": "depset[DepVariantInfo]: Dependency information from all crates in the group.",
     },
 )
 
diff --git a/rust/private/rust.bzl b/rust/private/rust.bzl
index 166d896..88b98d1 100644
--- a/rust/private/rust.bzl
+++ b/rust/private/rust.bzl
@@ -16,6 +16,7 @@
 
 load("@bazel_skylib//lib:paths.bzl", "paths")
 load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:providers.bzl", "BuildInfo")
 load("//rust/private:rustc.bzl", "rustc_compile_action")
 load(
     "//rust/private:utils.bzl",
@@ -491,17 +492,21 @@
     return providers
 
 def _rust_library_group_impl(ctx):
-    crate_infos = []
-    dep_infos = []
+    dep_variant_infos = []
+    dep_variant_transitive_infos = []
     runfiles = []
 
     for dep in ctx.attr.deps:
         if rust_common.crate_info in dep:
-            crate_infos.append(dep[rust_common.crate_info])
-            dep_infos.append(dep[rust_common.dep_info])
+            dep_variant_infos.append(rust_common.dep_variant_info(
+                crate_info = dep[rust_common.crate_info] if rust_common.crate_info in dep else None,
+                dep_info = dep[rust_common.dep_info] if rust_common.crate_info in dep else None,
+                build_info = dep[BuildInfo] if BuildInfo in dep else None,
+                cc_info = dep[CcInfo] if CcInfo in dep else None,
+                crate_group_info = None,
+            ))
         elif rust_common.crate_group_info in dep:
-            crate_infos.extend(dep[rust_common.crate_group_info].crate_infos)
-            dep_infos.extend(dep[rust_common.crate_group_info].dep_infos)
+            dep_variant_transitive_infos.append(dep[rust_common.crate_group_info].dep_variant_infos)
         else:
             fail("crate_group_info targets can only depend on rust_library or rust_library_group targets.")
 
@@ -510,8 +515,7 @@
 
     return [
         rust_common.crate_group_info(
-            crate_infos = crate_infos,
-            dep_infos = dep_infos,
+            dep_variant_infos = depset(dep_variant_infos, transitive = dep_variant_transitive_infos),
         ),
         DefaultInfo(runfiles = ctx.runfiles().merge_all(runfiles)),
         coverage_common.instrumented_files_info(
@@ -1422,6 +1426,7 @@
     attrs = {
         "deps": attr.label_list(
             doc = "Other dependencies to forward through this crate group.",
+            providers = [[rust_common.crate_group_info], [rust_common.crate_info]],
         ),
     },
     doc = dedent("""\
@@ -1429,7 +1434,7 @@
 
         Specifically, the following are equivalent:
 
-        ```rust
+        ```starlark
         rust_library_group(
             name = "crate_group",
             deps = [
@@ -1447,7 +1452,7 @@
 
         and
 
-        ```rust
+        ```starlark
         rust_library(
             name = "foobar",
             deps = [
diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl
index 6d4c90a..841d5a5 100644
--- a/rust/private/rustc.bzl
+++ b/rust/private/rustc.bzl
@@ -231,12 +231,10 @@
             crate_deps.append(dep)
 
         if crate_group:
-            if len(crate_group.crate_infos) != len(crate_group.dep_infos):
-                fail("CrateGroupInfo must have len(crate_infos) == len(dep_infos)")
-            for (crate_info, dep_info) in zip(crate_group.crate_infos, crate_group.dep_infos):
+            for dep_variant_info in crate_group.dep_variant_infos.to_list():
                 crate_deps.append(struct(
-                    crate_info = crate_info,
-                    dep_info = dep_info,
+                    crate_info = dep_variant_info.crate_info,
+                    dep_info = dep_variant_info.dep_info,
                 ))
 
     aliases = {k.label: v for k, v in aliases.items()}
diff --git a/rust/rust_common.bzl b/rust/rust_common.bzl
index 155c1f1..a895f5b 100644
--- a/rust/rust_common.bzl
+++ b/rust/rust_common.bzl
@@ -14,8 +14,19 @@
 
 """Module with Rust definitions required to write custom Rust rules."""
 
-load("//rust/private:providers.bzl", _BuildInfo = "BuildInfo", _ClippyInfo = "ClippyInfo", _CrateInfo = "CrateInfo")
+load(
+    "//rust/private:providers.bzl",
+    _BuildInfo = "BuildInfo",
+    _ClippyInfo = "ClippyInfo",
+    _CrateInfo = "CrateInfo",
+    _DepInfo = "DepInfo",
+    _DepVariantInfo = "DepVariantInfo",
+    _TestCrateInfo = "TestCrateInfo",
+)
 
 BuildInfo = _BuildInfo
-CrateInfo = _CrateInfo
 ClippyInfo = _ClippyInfo
+CrateInfo = _CrateInfo
+DepInfo = _DepInfo
+DepVariantInfo = _DepVariantInfo
+TestCrateInfo = _TestCrateInfo