use dope_core::driver::{route, settings};
use dope_runtime::executor;
use crate::app::dispatch;
unsafe fn activate<'a, 'driver, 'turn, 'd, M, R>(
call: executor::raw::Call<'a, M, (), executor::raw::Activate<'driver, 'turn, 'd>>,
) where
'd: 'driver + 'turn,
M: dispatch::raw::Activate<'d, R>,
R: route::App,
{
let (owner, (), wake) = call.into_parts();
let (target, turn, driver) = wake.into_parts();
let target = driver
.driver_ref()
.targets::<R>()
.bind(target.slot(), target.epoch());
let mut root = dispatch::raw::Context::<dispatch::raw::Retained>::new(driver);
let mut driver = root.narrow::<M::Access>();
unsafe { M::activate(owner, target, turn, &mut driver) };
}
pub unsafe trait Wakes<'d, M, R: route::App> {
type Plan;
const ROUTES: settings::Routes;
fn select() -> Option<Self::Plan>;
unsafe fn call<'a, 'driver, 'turn>(
call: executor::raw::Call<'a, M, Self::Plan, executor::raw::Activate<'driver, 'turn, 'd>>,
) where
'd: 'driver + 'turn;
}
unsafe impl<'d, M, R> Wakes<'d, M, R> for dispatch::raw::Projected<M>
where
R: route::App,
M: dispatch::raw::Projection<'d>,
M::Inner: dispatch::raw::Manifold<'d, Route = R>,
{
type Plan =
<<M::Inner as dispatch::raw::Manifold<'d>>::Activate as Wakes<'d, M::Inner, R>>::Plan;
const ROUTES: settings::Routes =
<<M::Inner as dispatch::raw::Manifold<'d>>::Activate as Wakes<'d, M::Inner, R>>::ROUTES;
fn select() -> Option<Self::Plan> {
<<M::Inner as dispatch::raw::Manifold<'d>>::Activate as Wakes<'d, M::Inner, R>>::select()
}
unsafe fn call<'a, 'driver, 'turn>(
call: executor::raw::Call<'a, M, Self::Plan, executor::raw::Activate<'driver, 'turn, 'd>>,
) where
'd: 'driver + 'turn,
{
unsafe {
<<M::Inner as dispatch::raw::Manifold<'d>>::Activate as Wakes<'d, M::Inner, R>>::call(
call.map_owner(dispatch::raw::Projection::inner_mut),
)
}
}
}
unsafe impl<'d, M, R> Wakes<'d, M, R> for dispatch::raw::Plain
where
M: dispatch::raw::Activate<'d, R, Access = dispatch::raw::Plain>,
R: route::App,
{
type Plan = ();
const ROUTES: settings::Routes = settings::Routes::singleton_id(R::ID);
fn select() -> Option<Self::Plan> {
Some(())
}
unsafe fn call<'a, 'driver, 'turn>(
call: executor::raw::Call<'a, M, Self::Plan, executor::raw::Activate<'driver, 'turn, 'd>>,
) where
'd: 'driver + 'turn,
{
unsafe { activate::<M, R>(call) };
}
}
unsafe impl<'d, M, R> Wakes<'d, M, R> for dispatch::raw::Retained
where
M: dispatch::raw::Activate<'d, R, Access = dispatch::raw::Retained>,
R: route::App,
{
type Plan = ();
const ROUTES: settings::Routes = settings::Routes::singleton_id(R::ID);
fn select() -> Option<Self::Plan> {
Some(())
}
unsafe fn call<'a, 'driver, 'turn>(
call: executor::raw::Call<'a, M, Self::Plan, executor::raw::Activate<'driver, 'turn, 'd>>,
) where
'd: 'driver + 'turn,
{
unsafe { activate::<M, R>(call) };
}
}