use crate::codec::sse::Dart2RustMessageSse;
use crate::codec::BaseCodec;
use crate::codec::Rust2DartMessageTrait;
use crate::platform_types::DartAbi;
use crate::platform_types::MessagePort;
use std::future::Future;
pub trait Handler {
#[cfg(feature = "thread-pool")]
fn wrap_normal<Rust2DartCodec, PrepareFn, TaskFn>(
&self,
task_info: TaskInfo,
prepare: PrepareFn,
) where
PrepareFn: FnOnce() -> TaskFn,
TaskFn: FnOnce(TaskContext) -> Result<Rust2DartCodec::Message, Rust2DartCodec::Message>
+ Send
+ 'static,
Rust2DartCodec: BaseCodec;
fn wrap_sync<Rust2DartCodec, SyncTaskFn>(
&self,
task_info: TaskInfo,
sync_task: SyncTaskFn,
) -> <Rust2DartCodec::Message as Rust2DartMessageTrait>::WireSyncRust2DartType
where
SyncTaskFn: FnOnce() -> Result<Rust2DartCodec::Message, Rust2DartCodec::Message>,
Rust2DartCodec: BaseCodec;
#[cfg(feature = "rust-async")]
fn wrap_async<Rust2DartCodec, PrepareFn, TaskFn, TaskRetFut>(
&self,
task_info: TaskInfo,
prepare: PrepareFn,
) where
PrepareFn: FnOnce() -> TaskFn,
TaskFn: FnOnce(TaskContext) -> TaskRetFut + Send + 'static,
TaskRetFut: Future<Output = Result<Rust2DartCodec::Message, Rust2DartCodec::Message>>
+ TaskRetFutTrait,
Rust2DartCodec: BaseCodec;
#[cfg(all(feature = "rust-async", feature = "dart-opaque"))]
fn dart_fn_invoke(
&self,
dart_fn: crate::dart_opaque::DartOpaque,
args: Vec<DartAbi>,
) -> crate::dart_fn::DartFnFuture<Dart2RustMessageSse>;
#[cfg(all(feature = "rust-async", feature = "dart-opaque"))]
fn dart_fn_handle_output(&self, call_id: i32, message: Dart2RustMessageSse);
}
#[derive(Clone)]
pub struct TaskInfo {
pub port: Option<MessagePort>,
pub debug_name: &'static str,
pub mode: FfiCallMode,
}
#[derive(Copy, Clone, PartialEq, Eq)]
pub enum FfiCallMode {
Normal,
Sync,
}
#[cfg(not(target_family = "wasm"))]
pub trait TaskRetFutTrait: Send {}
#[cfg(not(target_family = "wasm"))]
impl<T: Send> TaskRetFutTrait for T {}
#[cfg(target_family = "wasm")]
pub trait TaskRetFutTrait {}
#[cfg(target_family = "wasm")]
impl<T> TaskRetFutTrait for T {}
pub struct TaskContext {}
impl Default for TaskContext {
fn default() -> Self {
Self::new()
}
}
impl TaskContext {
pub fn new() -> Self {
Self {}
}
}