flutter_rust_bridge/handler/
handler.rs1use crate::codec::sse::Dart2RustMessageSse;
2use crate::codec::BaseCodec;
3use crate::codec::Rust2DartMessageTrait;
4use crate::platform_types::DartAbi;
5use crate::platform_types::MessagePort;
6use std::future::Future;
7
8pub trait Handler {
13 #[cfg(feature = "thread-pool")]
24 fn wrap_normal<Rust2DartCodec, PrepareFn, TaskFn>(
25 &self,
26 task_info: TaskInfo,
27 prepare: PrepareFn,
28 ) where
29 PrepareFn: FnOnce() -> TaskFn,
30 TaskFn: FnOnce(TaskContext) -> Result<Rust2DartCodec::Message, Rust2DartCodec::Message>
31 + Send
32 + 'static,
33 Rust2DartCodec: BaseCodec;
34
35 fn wrap_sync<Rust2DartCodec, SyncTaskFn>(
38 &self,
39 task_info: TaskInfo,
40 sync_task: SyncTaskFn,
41 ) -> <Rust2DartCodec::Message as Rust2DartMessageTrait>::WireSyncRust2DartType
42 where
43 SyncTaskFn: FnOnce() -> Result<Rust2DartCodec::Message, Rust2DartCodec::Message>,
44 Rust2DartCodec: BaseCodec;
45
46 #[cfg(feature = "rust-async")]
48 fn wrap_async<Rust2DartCodec, PrepareFn, TaskFn, TaskRetFut>(
49 &self,
50 task_info: TaskInfo,
51 prepare: PrepareFn,
52 ) where
53 PrepareFn: FnOnce() -> TaskFn,
54 TaskFn: FnOnce(TaskContext) -> TaskRetFut + Send + 'static,
55 TaskRetFut: Future<Output = Result<Rust2DartCodec::Message, Rust2DartCodec::Message>>
56 + TaskRetFutTrait,
57 Rust2DartCodec: BaseCodec;
58
59 #[cfg(all(feature = "rust-async", feature = "dart-opaque"))]
60 fn dart_fn_invoke(
61 &self,
62 dart_fn: crate::dart_opaque::DartOpaque,
63 args: Vec<DartAbi>,
64 ) -> crate::dart_fn::DartFnFuture<Dart2RustMessageSse>;
65
66 #[cfg(all(feature = "rust-async", feature = "dart-opaque"))]
67 fn dart_fn_handle_output(&self, call_id: i32, message: Dart2RustMessageSse);
68}
69
70#[derive(Clone)]
72pub struct TaskInfo {
73 pub port: Option<MessagePort>,
75 pub debug_name: &'static str,
77 pub mode: FfiCallMode,
79}
80
81#[derive(Copy, Clone, PartialEq, Eq)]
83pub enum FfiCallMode {
84 Normal,
86 Sync,
88}
89
90#[cfg(not(target_family = "wasm"))]
91pub trait TaskRetFutTrait: Send {}
92#[cfg(not(target_family = "wasm"))]
93impl<T: Send> TaskRetFutTrait for T {}
94
95#[cfg(target_family = "wasm")]
96pub trait TaskRetFutTrait {}
97#[cfg(target_family = "wasm")]
98impl<T> TaskRetFutTrait for T {}
99
100pub struct TaskContext {}
103
104impl Default for TaskContext {
106 fn default() -> Self {
107 Self::new()
108 }
109}
110impl TaskContext {
113 pub fn new() -> Self {
114 Self {}
115 }
116}