use drone_core::drv::Resource;
use drone_micropython_core::exec::UncaughtException;
use drone_micropython_core::{Cmd, CmdRes, MpSessResCore};
use drone_plat::stack_adapter::{Context, Stack};
use futures::prelude::*;
use rt::init_stack;
#[derive(Driver, Resource)]
pub struct MpSessPlat<T: MpSessResPlat>(T);
pub trait MpSessResPlat: Resource<Source = Self> {
type Stack: Stack<Cmd, CmdRes, Self::Req, Self::ReqRes>;
type Context: Context<Self::Req, Self::ReqRes>;
type Req: Send + 'static;
type ReqRes: Send + 'static;
type Error: From<UncaughtException>;
const STACK_SIZE: usize;
const HEAP_SIZE: usize;
fn stack(&mut self) -> &mut Self::Stack;
fn run_req<'sess>(
&'sess mut self,
req: Self::Req,
) -> Box<Future<Item = Self::ReqRes, Error = Self::Error> + 'sess>;
}
impl<T: MpSessResPlat> MpSessResCore for MpSessPlat<T> {
type Stack = T::Stack;
type Context = T::Context;
type Req = T::Req;
type ReqRes = T::ReqRes;
type Error = T::Error;
const STACK_SIZE: usize = T::STACK_SIZE;
const HEAP_SIZE: usize = T::HEAP_SIZE;
fn init() {
init_stack();
}
fn stack(&mut self) -> &mut Self::Stack {
self.0.stack()
}
fn run_req<'sess>(
&'sess mut self,
req: Self::Req,
) -> Box<Future<Item = Self::ReqRes, Error = Self::Error> + 'sess> {
self.0.run_req(req)
}
}