use std::{ops, pin};
use dope_core::{
driver::{schedule, settings},
io,
};
use crate::executor;
pub trait Layout<'d> {
type ParkPlan;
}
pub unsafe trait App<'d>: Sized + Layout<'d> {
const ROUTES: settings::Routes;
const WAKE_ROUTES: settings::Routes = settings::Routes::EMPTY;
const COORDS: usize;
fn select_park() -> Option<Self::ParkPlan>;
fn prepare_park(_: pin::Pin<&Self>, _: &mut Self::ParkPlan) -> Option<executor::raw::Count> {
Some(executor::raw::Count::new(Self::COORDS))
}
unsafe fn park<'app, 'driver, 'turn, 'root>(
app: pin::Pin<&'app mut Self>,
plan: &mut Self::ParkPlan,
park: executor::raw::Park<'driver, 'turn, 'root, 'd>,
) where
'd: 'driver + 'turn + 'root;
fn admit(
_: pin::Pin<&Self>,
needs: &mut settings::claim::Needs,
) -> Result<(), settings::errors::Claim> {
*needs = needs.include(settings::claim::Claim::new(Self::ROUTES))?;
Ok(())
}
fn released(released: executor::raw::Released<'_, Self>) -> executor::raw::Released<'_, Self> {
released
}
fn install<'app, 'owner>(
install: executor::raw::Install<'app, 'owner, 'd, Self>,
) -> executor::raw::Install<'app, 'owner, 'd, Self> {
install
}
unsafe fn activate<'app, 'driver, 'turn, 'root>(
_: pin::Pin<&'app mut Self>,
_: executor::raw::Activate<'driver, 'turn, 'root, 'd>,
) -> bool
where
'd: 'driver + 'turn + 'root,
{
false
}
fn dispatch<'app, 'driver, 'turn, 'root>(
call: executor::raw::Dispatch<'app, 'driver, 'turn, 'root, 'd, Self>,
) -> ops::ControlFlow<io::Event<'d>>
where
'd: 'root,
Self: 'root,
{
ops::ControlFlow::Break(call.into_event())
}
fn progress(
app: pin::Pin<&Self>,
view: executor::raw::Progress<'_, '_, 'd>,
) -> schedule::Progress<'d>;
fn stopping(
app: pin::Pin<&Self>,
view: executor::raw::Progress<'_, '_, 'd>,
) -> schedule::Progress<'d>;
fn shutdown<'app, 'turn, 'driver, 'owner>(
shutdown: executor::raw::Shutdown<'app, 'turn, 'driver, 'owner, 'd, Self>,
) -> executor::raw::Shutdown<'app, 'turn, 'driver, 'owner, 'd, Self>
where
'd: 'owner,
{
shutdown
}
fn finish<'app, 'finish, 'owner, 'epoch>(
finish: executor::raw::Finish<'app, 'finish, 'owner, 'epoch, 'd, Self>,
) -> executor::raw::Finish<'app, 'finish, 'owner, 'epoch, 'd, Self> {
finish
}
}