mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 19:21:13 +00:00
SimpleSlotWorker: Do not implement SlotWorker for all types implementing SimpleSlotWorker (#10934)
Because Rust currently doesn't support specialization, it prevents users from implementing `SlotWorker` for their own types. This pr solves this by removing the generic implementation of `SlotWorker` for `SimpleSlotWorker` and providing some wrapper type for that.
This commit is contained in:
@@ -279,7 +279,7 @@ where
|
||||
L: sc_consensus::JustificationSyncLink<B>,
|
||||
BS: BackoffAuthoringBlocksStrategy<NumberFor<B>> + Send + Sync + 'static,
|
||||
{
|
||||
AuraWorker {
|
||||
sc_consensus_slots::SimpleSlotWorkerToSlotWorker(AuraWorker {
|
||||
client,
|
||||
block_import,
|
||||
env: proposer_factory,
|
||||
@@ -292,7 +292,7 @@ where
|
||||
block_proposal_slot_portion,
|
||||
max_block_proposal_slot_portion,
|
||||
_key_type: PhantomData::<P>,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
struct AuraWorker<C, E, I, P, SO, L, BS> {
|
||||
|
||||
@@ -518,7 +518,7 @@ where
|
||||
let slot_worker = sc_consensus_slots::start_slot_worker(
|
||||
babe_link.config.slot_duration(),
|
||||
select_chain,
|
||||
worker,
|
||||
sc_consensus_slots::SimpleSlotWorkerToSlotWorker(worker),
|
||||
sync_oracle,
|
||||
create_inherent_data_providers,
|
||||
can_author_with,
|
||||
|
||||
@@ -401,15 +401,22 @@ pub trait SimpleSlotWorker<B: BlockT> {
|
||||
}
|
||||
}
|
||||
|
||||
/// A type that implements [`SlotWorker`] for a type that implements [`SimpleSlotWorker`].
|
||||
///
|
||||
/// This is basically a workaround for Rust not supporting specialization. Otherwise we could
|
||||
/// implement [`SlotWorker`] for any `T` that implements [`SimpleSlotWorker`], but currently
|
||||
/// that would prevent downstream users to implement [`SlotWorker`] for their own types.
|
||||
pub struct SimpleSlotWorkerToSlotWorker<T>(pub T);
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl<B: BlockT, T: SimpleSlotWorker<B> + Send + Sync>
|
||||
SlotWorker<B, <T::Proposer as Proposer<B>>::Proof> for T
|
||||
impl<T: SimpleSlotWorker<B> + Send + Sync, B: BlockT>
|
||||
SlotWorker<B, <T::Proposer as Proposer<B>>::Proof> for SimpleSlotWorkerToSlotWorker<T>
|
||||
{
|
||||
async fn on_slot(
|
||||
&mut self,
|
||||
slot_info: SlotInfo<B>,
|
||||
) -> Option<SlotResult<B, <T::Proposer as Proposer<B>>::Proof>> {
|
||||
SimpleSlotWorker::on_slot(self, slot_info).await
|
||||
self.0.on_slot(slot_info).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user