Remove second generic from .add_before, .add_after (#14285)
# Objective
```rust
// Currently:
builder.add_after::<FooPlugin, _>(BarPlugin);
// After this PR:
builder.add_after::<FooPlugin>(BarPlugin);
```
This removes some weirdness and better parallels the rest of the
`PluginGroupBuilder` API.
## Solution
Define a helper method `type_id_of_val` to use in `.add_before` and
`.add_after` instead of `TypeId::of::<T>` (which requires the plugin
type to be nameable, preventing `impl Plugin` from being used).
## Testing
Ran `cargo run -p ci lints` successfully.
## Migration Guide
Removed second generic from `PluginGroupBuilder` methods: `add_before`
and `add_after`.
```rust
// Before:
DefaultPlugins
.build()
.add_before::<WindowPlugin, _>(FooPlugin)
.add_after::<WindowPlugin, _>(BarPlugin)
// After:
DefaultPlugins
.build()
.add_before::<WindowPlugin>(FooPlugin)
.add_after::<WindowPlugin>(BarPlugin)
```
---------
Co-authored-by: BD103 <59022059+BD103@users.noreply.github.com>
This commit is contained in:
parent
65aae92127
commit
7cb97852a5
@ -27,6 +27,11 @@ impl PluginGroup for PluginGroupBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Helper method to get the [`TypeId`] of a value without having to name its type.
|
||||||
|
fn type_id_of_val<T: 'static>(_: &T) -> TypeId {
|
||||||
|
TypeId::of::<T>()
|
||||||
|
}
|
||||||
|
|
||||||
/// Facilitates the creation and configuration of a [`PluginGroup`].
|
/// Facilitates the creation and configuration of a [`PluginGroup`].
|
||||||
/// Provides a build ordering to ensure that [`Plugin`]s which produce/require a [`Resource`](bevy_ecs::system::Resource)
|
/// Provides a build ordering to ensure that [`Plugin`]s which produce/require a [`Resource`](bevy_ecs::system::Resource)
|
||||||
/// are built before/after dependent/depending [`Plugin`]s. [`Plugin`]s inside the group
|
/// are built before/after dependent/depending [`Plugin`]s. [`Plugin`]s inside the group
|
||||||
@ -153,9 +158,9 @@ impl PluginGroupBuilder {
|
|||||||
/// Adds a [`Plugin`] in this [`PluginGroupBuilder`] before the plugin of type `Target`.
|
/// Adds a [`Plugin`] in this [`PluginGroupBuilder`] before the plugin of type `Target`.
|
||||||
/// If the plugin was already the group, it is removed from its previous place. There must
|
/// If the plugin was already the group, it is removed from its previous place. There must
|
||||||
/// be a plugin of type `Target` in the group or it will panic.
|
/// be a plugin of type `Target` in the group or it will panic.
|
||||||
pub fn add_before<Target: Plugin, T: Plugin>(mut self, plugin: T) -> Self {
|
pub fn add_before<Target: Plugin>(mut self, plugin: impl Plugin) -> Self {
|
||||||
let target_index = self.index_of::<Target>();
|
let target_index = self.index_of::<Target>();
|
||||||
self.order.insert(target_index, TypeId::of::<T>());
|
self.order.insert(target_index, type_id_of_val(&plugin));
|
||||||
self.upsert_plugin_state(plugin, target_index);
|
self.upsert_plugin_state(plugin, target_index);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
@ -163,9 +168,9 @@ impl PluginGroupBuilder {
|
|||||||
/// Adds a [`Plugin`] in this [`PluginGroupBuilder`] after the plugin of type `Target`.
|
/// Adds a [`Plugin`] in this [`PluginGroupBuilder`] after the plugin of type `Target`.
|
||||||
/// If the plugin was already the group, it is removed from its previous place. There must
|
/// If the plugin was already the group, it is removed from its previous place. There must
|
||||||
/// be a plugin of type `Target` in the group or it will panic.
|
/// be a plugin of type `Target` in the group or it will panic.
|
||||||
pub fn add_after<Target: Plugin, T: Plugin>(mut self, plugin: T) -> Self {
|
pub fn add_after<Target: Plugin>(mut self, plugin: impl Plugin) -> Self {
|
||||||
let target_index = self.index_of::<Target>() + 1;
|
let target_index = self.index_of::<Target>() + 1;
|
||||||
self.order.insert(target_index, TypeId::of::<T>());
|
self.order.insert(target_index, type_id_of_val(&plugin));
|
||||||
self.upsert_plugin_state(plugin, target_index);
|
self.upsert_plugin_state(plugin, target_index);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
@ -285,7 +290,7 @@ mod tests {
|
|||||||
let group = PluginGroupBuilder::start::<NoopPluginGroup>()
|
let group = PluginGroupBuilder::start::<NoopPluginGroup>()
|
||||||
.add(PluginA)
|
.add(PluginA)
|
||||||
.add(PluginB)
|
.add(PluginB)
|
||||||
.add_after::<PluginA, PluginC>(PluginC);
|
.add_after::<PluginA>(PluginC);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
group.order,
|
group.order,
|
||||||
@ -302,7 +307,7 @@ mod tests {
|
|||||||
let group = PluginGroupBuilder::start::<NoopPluginGroup>()
|
let group = PluginGroupBuilder::start::<NoopPluginGroup>()
|
||||||
.add(PluginA)
|
.add(PluginA)
|
||||||
.add(PluginB)
|
.add(PluginB)
|
||||||
.add_before::<PluginB, PluginC>(PluginC);
|
.add_before::<PluginB>(PluginC);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
group.order,
|
group.order,
|
||||||
@ -338,7 +343,7 @@ mod tests {
|
|||||||
.add(PluginA)
|
.add(PluginA)
|
||||||
.add(PluginB)
|
.add(PluginB)
|
||||||
.add(PluginC)
|
.add(PluginC)
|
||||||
.add_after::<PluginA, PluginC>(PluginC);
|
.add_after::<PluginA>(PluginC);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
group.order,
|
group.order,
|
||||||
@ -356,7 +361,7 @@ mod tests {
|
|||||||
.add(PluginA)
|
.add(PluginA)
|
||||||
.add(PluginB)
|
.add(PluginB)
|
||||||
.add(PluginC)
|
.add(PluginC)
|
||||||
.add_before::<PluginB, PluginC>(PluginC);
|
.add_before::<PluginB>(PluginC);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
group.order,
|
group.order,
|
||||||
|
|||||||
@ -16,7 +16,7 @@ fn main() {
|
|||||||
// HelloWorldPlugins
|
// HelloWorldPlugins
|
||||||
// .build()
|
// .build()
|
||||||
// .disable::<PrintWorldPlugin>()
|
// .disable::<PrintWorldPlugin>()
|
||||||
// .add_before::<PrintHelloPlugin, _>(
|
// .add_before::<PrintHelloPlugin>(
|
||||||
// bevy::diagnostic::LogDiagnosticsPlugin::default(),
|
// bevy::diagnostic::LogDiagnosticsPlugin::default(),
|
||||||
// ),
|
// ),
|
||||||
// )
|
// )
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user