fzyzcjy / flutter_rust_bridge

Flutter/Dart <-> Rust binding generator, feature-rich, but seamless and simple.
https://fzyzcjy.github.io/flutter_rust_bridge/
MIT License
3.64k stars 256 forks source link

Returning a `Future` is not translated into an async Dart function (but can use return types directly without wrapping with a Future) #1927

Closed vhdirk closed 2 weeks ago

vhdirk commented 3 weeks ago

Describe the bug

Functions that explicitly return a Future rather than just being async aren't recognized as async functions. They just take the return type at face value and make it opaque.

Steps to reproduce

I made some examples here: https://github.com/vhdirk/flutter_rust_bridge/blob/future-result/frb_example/dart_minimal/rust/src/api/minimal.rs. There are 4 variations:

  1. greet: return a DartFnFuture<Result<String, u32>>. Gets translated into Future<DartFnFutureResultStringU32>
  2. hey: unalias DartFnFuture, return Pin<Box<dyn Future<Output = Result<String, u32>> + Send + 'static>>. Gets translated into Future<PinBoxFutureOutputResultStringU32>
  3. yo: simpler return type. just a DartFnFuture<String>. Translated into Future<DartFnFutureString>
  4. Same as 3, but marked with frb(sync). Translates to DartFnFutureString.

Logs

[2024-05-07T06:55:51.981Z DEBUG frb_codegen/src/main.rs:24] cli=Cli { verbose: false, command: Generate(GenerateCommandArgs { watch: false, primary: GenerateCommandArgsPrimary { config_file: None, rust_input: None, dart_output: None, c_output: None, duplicated_c_output: None, rust_root: None, rust_output: None, dart_entrypoint_class_name: None, dart_format_line_length: None, no_dart_enums_style: false, no_add_mod_to_lib: false, llvm_path: None, llvm_compiler_opts: None, dart_root: None, no_build_runner: false, extra_headers: None, no_web: false, no_deps_check: false, default_external_library_loader_web_prefix: None, no_dart3: false, full_dep: false, local: false, dump: None, dump_all: false } }) }
[2024-05-07T06:55:51.981Z DEBUG frb_codegen/src/binary/commands_parser.rs:8] compute_codegen_config: mode=from_files_auto
[2024-05-07T06:55:51.981Z DEBUG frb_codegen/src/library/codegen/config/config_parser.rs:45] Found config file flutter_rust_bridge.yaml
[2024-05-07T06:55:51.982Z DEBUG frb_codegen/src/library/codegen/mod.rs:24] config=Config { base_dir: Some(""), rust_input: "rust/src/api/**/*.rs", dart_output: "lib/src/rust", c_output: Some("frb_generated.h"), duplicated_c_output: None, rust_root: None, rust_output: None, dart_entrypoint_class_name: None, dart_format_line_length: None, dart_enums_style: None, add_mod_to_lib: None, llvm_path: None, llvm_compiler_opts: None, dart_root: None, build_runner: None, extra_headers: None, web: None, deps_check: None, dart3: None, full_dep: None, local: Some(true), default_external_library_loader_web_prefix: None, dump: None, dump_all: Some(true) } meta_config=MetaConfig { watch: false }
[2024-05-07T06:55:51.983Z DEBUG frb_codegen/src/library/codegen/config/internal_config_parser.rs:42] InternalConfig.parse base_dir="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal"
[2024-05-07T06:55:52.117Z DEBUG frb_codegen/src/library/codegen/mod.rs:27] internal_config=InternalConfig { controller: ControllerInternalConfig { watch: false, watching_paths: ["/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src"], exclude_paths: ["/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.io.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.web.rs"], max_count: None }, preparer: PreparerInternalConfig { dart_root: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal", deps_check: true, needs_ffigen: false }, parser: ParserInternalConfig { rust_input_path_pack: RustInputPathPack { rust_input_paths: ["/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/minimal.rs"] }, rust_crate_dir: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust", force_codec_mode_pack: Some(CodecModePack { dart2rust: Pde, rust2dart: Pde }), default_stream_sink_codec: Sse, default_rust_opaque_codec: Moi }, generator: GeneratorInternalConfig { api_dart: GeneratorApiDartInternalConfig { dart_enums_style: true, dart3: true, dart_decl_base_output_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/lib/src/rust", dart_entrypoint_class_name: "RustLib" }, wire: GeneratorWireInternalConfig { dart: GeneratorWireDartInternalConfig { has_ffigen: false, web_enabled: true, llvm_path: ["/opt/homebrew/opt/llvm", "/usr/local/opt/llvm", "/usr/lib/llvm-9", "/usr/lib/llvm-10", "/usr/lib/llvm-11", "/usr/lib/llvm-12", "/usr/lib/llvm-13", "/usr/lib/llvm-14", "/usr/lib/", "/usr/lib64/", "C:/Program Files/llvm", "C:/msys64/mingw64"], llvm_compiler_opts: "", dart_root: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal", extra_headers: "", dart_impl_output_path: TargetOrCommonMap { common: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/lib/src/rust/frb_generated.dart", io: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/lib/src/rust/frb_generated.io.dart", web: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/lib/src/rust/frb_generated.web.dart" }, dart_output_class_name_pack: DartOutputClassNamePack { entrypoint_class_name: "RustLib", api_class_name: "RustLibApi", api_impl_class_name: "RustLibApiImpl", api_impl_platform_class_name: "RustLibApiImplPlatform", wire_class_name: "RustLibWire", wasm_module_name: "RustLibWasmModule" }, default_external_library_loader: GeneratorWireDartDefaultExternalLibraryLoaderInternalConfig { stem: "frb_example_dart_minimal", io_directory: "rust/target/release/", web_prefix: "pkg/" }, c_symbol_prefix: "frbgen_frb_example_dart_minimal_" }, rust: GeneratorWireRustInternalConfig { rust_input_path_pack: RustInputPathPack { rust_input_paths: ["/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/minimal.rs"] }, rust_crate_dir: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust", web_enabled: true, rust_output_path: TargetOrCommonMap { common: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", io: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.io.rs", web: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.web.rs" }, c_symbol_prefix: "frbgen_frb_example_dart_minimal_", has_ffigen: false, default_stream_sink_codec: Sse, default_rust_opaque_codec: Moi }, c: GeneratorWireCInternalConfig { enable: false, rust_crate_dir: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust", rust_output_path: TargetOrCommonMap { common: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", io: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.io.rs", web: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.web.rs" }, c_output_path: Some("/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/frb_generated.h"), c_symbol_prefix: "frbgen_frb_example_dart_minimal_" } } }, polisher: PolisherInternalConfig { duplicated_c_output_path: [], dart_format_line_length: 80, add_mod_to_lib: true, build_runner: true, web_enabled: true, dart_root: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal", rust_crate_dir: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust", rust_output_path: TargetOrCommonMap { common: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", io: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.io.rs", web: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.web.rs" }, c_output_path: Some("/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/frb_generated.h"), enable_auto_upgrade: false }, dumper: DumperInternalConfig { dump_contents: [Config, Source, SourceGraph, Ir, GeneratorInfo, GeneratorSpec, GeneratorText], dump_directory: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump" } }
[2024-05-07T06:55:52.117Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping config.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/config/config.json"
[2024-05-07T06:55:52.118Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping internal_config.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/config/internal_config.json"
[2024-05-07T06:55:52.118Z DEBUG frb_codegen/src/library/utils/dart_repository/dart_repo.rs:22] Guessing toolchain the runner is run into
[2024-05-07T06:55:52.122Z DEBUG frb_codegen/src/library/commands/command_runner.rs:129] execute command: bin=sh args="-c \"dart\" \"--version\"" current_dir=None cmd="sh" "-c" "\"dart\" \"--version\""
[2024-05-07T06:55:52.135Z DEBUG frb_codegen/src/library/commands/command_runner.rs:140] command="sh" "-c" "\"dart\" \"--version\"" stdout=Dart SDK version: 3.3.4 (stable) (Tue Apr 16 19:56:12 2024 +0000) on "linux_x64"
 stderr=
[2024-05-07T06:55:52.136Z DEBUG frb_codegen/src/library/codegen/parser/reader.rs:22] read_rust_file rust_file_path="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/minimal.rs" module=Some("api::minimal")
[2024-05-07T06:55:52.136Z DEBUG frb_codegen/src/library/commands/cargo_expand.rs:31] CachedCargoExpand execute manifest_dir= rust_crate_dir="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust"
[2024-05-07T06:55:52.136Z DEBUG frb_codegen/src/library/commands/cargo_expand.rs:118] Running cargo expand in '"/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust"'
[2024-05-07T06:55:52.136Z DEBUG frb_codegen/src/library/commands/command_runner.rs:129] execute command: bin=cargo args="expand --lib --theme=none --ugly" current_dir=Some("/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust") cmd=cd "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust" && RUSTFLAGS="--cfg frb_expand" "cargo" "expand" "--lib" "--theme=none" "--ugly"
[2024-05-07T06:56:00.351Z DEBUG frb_codegen/src/library/commands/command_runner.rs:140] command=cd "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust" && RUSTFLAGS="--cfg frb_expand" "cargo" "expand" "--lib" "--theme=none" "--ugly" stdout=#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
pub mod api {
    /* AUTO INJECTED BY flutter_rust_bridge. This line may not be accurate, and you can change it according to your needs. */
    pub mod minimal {
        pub use std::future::{self, Future};
        pub use flutter_rust_bridge::DartFnFuture;
        pub use std::pin::Pin;
        use flutter_rust_bridge::frb;
        #[doc = r###"frb_marker: #[frb(init)]"###]
        pub fn init_app() { flutter_rust_bridge::setup_default_user_utils(); }
        pub fn minimal_adder(a: i32, b: i32) -> i32 { a + b }
        pub fn greet(name: String) -> DartFnFuture<Result<String, u32>> {
            future::ready(Ok({
                        let res =
                            ::alloc::fmt::format(format_args!("Hello, {0}!", name));
                        res
                    }))
        }
        pub fn hey(name: String)
            ->
                Pin<Box<dyn Future<Output = Result<String, u32>> + Send +
                'static>> {
            Box::pin(future::ready(Ok({
                            let res =
                                ::alloc::fmt::format(format_args!("Hello, {0}!", name));
                            res
                        })))
        }
        pub fn yo(name: String) -> DartFnFuture<String> {
            future::ready({
                    let res =
                        ::alloc::fmt::format(format_args!("Hello, {0}!", name));
                    res
                })
        }
        #[doc = r###"frb_marker: #[frb(sync)]"###]
        pub fn hallo(name: String) -> DartFnFuture<String> {
            future::ready({
                    let res =
                        ::alloc::fmt::format(format_args!("Hello, {0}!", name));
                    res
                })
        }
    }
}
mod frb_generated {
    #![allow(non_camel_case_types, unused, non_snake_case,
    clippy::needless_return, clippy::redundant_closure_call,
    clippy::redundant_closure, clippy::useless_conversion, clippy::unit_arg,
    clippy::unused_unit, clippy::double_parens, clippy::let_and_return,
    clippy::too_many_arguments, clippy::match_single_binding)]
    use crate::api::minimal::*;
    use flutter_rust_bridge::for_generated::byteorder::{
        NativeEndian, ReadBytesExt, WriteBytesExt,
    };
    use flutter_rust_bridge::for_generated::transform_result_dco;
    use flutter_rust_bridge::{Handler, IntoIntoDart};
    #[doc(hidden)]
    pub(crate) struct FrbWrapper<T>(T);
    impl<T: Clone> Clone for FrbWrapper<T> {
        fn clone(&self) -> Self { FrbWrapper(self.0.clone()) }
    }
    impl<T: PartialEq> PartialEq for FrbWrapper<T> {
        fn eq(&self, other: &Self) -> bool { self.0.eq(&other.0) }
    }
    impl<T: Eq> Eq for FrbWrapper<T> {}
    impl<T: std::hash::Hash> std::hash::Hash for FrbWrapper<T> {
        fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
            self.0.hash(state)
        }
    }
    impl<T> From<T> for FrbWrapper<T> {
        fn from(t: T) -> Self { FrbWrapper(t) }
    }
    use std::collections::HashMap;
    use std::marker::PhantomData;
    use std::sync::Arc;
    pub struct MoiArc<T: ?Sized + MoiArcValue> {
        object_id: Option<ObjectId>,
        value: Option<Arc<T>>,
        _phantom: PhantomData<T>,
    }
    #[automatically_derived]
    impl<T: ::core::fmt::Debug + ?Sized + MoiArcValue> ::core::fmt::Debug for
        MoiArc<T> {
        #[inline]
        fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
            ::core::fmt::Formatter::debug_struct_field3_finish(f, "MoiArc",
                "object_id", &self.object_id, "value", &self.value,
                "_phantom", &&self._phantom)
        }
    }
    impl<T: ?Sized + MoiArcValue> Drop for MoiArc<T> {
        fn drop(&mut self) {
            if let Some(object_id) = self.object_id {
                    Self::decrement_strong_count(object_id);
                }
        }
    }
    impl<T: ?Sized + MoiArcValue> AsRef<T> for MoiArc<T> {
        fn as_ref(&self) -> &T { self.value.as_ref().unwrap().as_ref() }
    }
    impl<T: ?Sized + MoiArcValue>
        ::flutter_rust_bridge::for_generated::BaseArc<T> for MoiArc<T> {
        fn new(value: T) -> Self where T: Sized {
            let mut pool = T::get_pool().write().unwrap();
            let object_id = pool.id_generator.next_id();
            let value = Arc::new(value);
            let old_value =
                pool.map.insert(object_id,
                    MoiArcPoolValue { ref_count: 1, value: value.clone() });
            if !old_value.is_none() {
                    ::core::panicking::panic("assertion failed: old_value.is_none()")
                };
            Self {
                object_id: Some(object_id),
                value: Some(value),
                _phantom: PhantomData,
            }
        }
        fn try_unwrap(mut self) -> Result<T, Self> where T: Sized {
            let pool = &mut T::get_pool().write().unwrap();
            if pool.map.get(&self.object_id.unwrap()).unwrap().ref_count == 1
                    {
                    Self::decrement_strong_count_raw(self.object_id.unwrap(),
                        pool);
                    self.object_id.take().unwrap();
                    Ok(Arc::into_inner(self.value.take().unwrap()).unwrap())
                } else { Err(self) }
        }
        fn into_inner(self) -> Option<T> where T: Sized {
            self.try_unwrap().ok()
        }
        fn into_raw(mut self) -> usize { self.object_id.take().unwrap() }
    }
    impl<T: ?Sized + MoiArcValue> Clone for MoiArc<T> {
        fn clone(&self) -> Self {
            Self::increment_strong_count(self.object_id.unwrap());
            Self {
                object_id: self.object_id,
                value: self.value.clone(),
                _phantom: PhantomData,
            }
        }
    }
    impl<T: ?Sized + MoiArcValue> MoiArc<T> {
        pub(crate) fn from_raw(raw: usize) -> Self where T: Sized {
            let map = &T::get_pool().read().unwrap().map;
            Self {
                object_id: Some(raw),
                value: Some(map.get(&raw).unwrap().value.clone()),
                _phantom: PhantomData,
            }
        }
        pub fn increment_strong_count(raw: usize) {
            let map = &mut T::get_pool().write().unwrap().map;
            map.get_mut(&raw).unwrap().ref_count += 1;
        }
        pub fn decrement_strong_count(raw: usize) {
            Self::decrement_strong_count_raw(raw,
                &mut T::get_pool().write().unwrap())
        }
        fn decrement_strong_count_raw(raw: usize,
            pool: &mut MoiArcPoolInner<T>) {
            let value = pool.map.get_mut(&raw).unwrap();
            value.ref_count -= 1;
            if value.ref_count == 0 { pool.map.remove(&raw).unwrap(); }
        }
    }
    pub trait MoiArcValue: 'static {
        fn get_pool()
        -> &'static MoiArcPool<Self>;
    }
    type ObjectId = usize;
    pub type MoiArcPool<T> = std::sync::RwLock<MoiArcPoolInner<T>>;
    pub struct MoiArcPoolInner<T: ?Sized> {
        map: HashMap<ObjectId, MoiArcPoolValue<T>>,
        id_generator: IdGenerator,
    }
    impl<T: ?Sized> Default for MoiArcPoolInner<T> {
        fn default() -> Self {
            Self { map: HashMap::new(), id_generator: Default::default() }
        }
    }
    struct IdGenerator {
        next_id: ObjectId,
    }
    impl Default for IdGenerator {
        fn default() -> Self { Self { next_id: Self::MIN_ID } }
    }
    impl IdGenerator {
        const MIN_ID: ObjectId = 1;
        const MAX_ID: ObjectId = 2147483600;
        fn next_id(&mut self) -> ObjectId {
            let ans = self.next_id;
            self.next_id =
                if self.next_id >= Self::MAX_ID {
                        Self::MIN_ID
                    } else { self.next_id + 1 };
            ans
        }
    }
    impl<T: ?Sized> MoiArcPoolInner<T> {}
    struct MoiArcPoolValue<T: ?Sized> {
        ref_count: i32,
        value: Arc<T>,
    }
    use ::flutter_rust_bridge::for_generated::decode_rust_opaque_nom;
    fn decode_rust_opaque_moi<T: MoiArcValue + Send + Sync>(ptr: usize)
        -> RustOpaqueMoi<T> {
        RustOpaqueMoi::from_arc(MoiArc::<T>::from_raw(ptr))
    }
    use ::flutter_rust_bridge::for_generated::StdArc;
    use ::flutter_rust_bridge::RustOpaqueNom;
    /// Please refer to `RustOpaque` for doc.
    pub type RustOpaqueMoi<T> =
        ::flutter_rust_bridge::for_generated::RustOpaqueBase<T, MoiArc<T>>;
    /// A wrapper to support [arbitrary Rust types](https://cjycode.com/flutter_rust_bridge/guides/types/arbitrary).
    pub type RustOpaque<T> = RustOpaqueMoi<T>;
    use ::flutter_rust_bridge::RustAutoOpaqueNom;
    /// Please refer to `RustAutoOpaque` for doc.
    pub type RustAutoOpaqueMoi<T> =
        ::flutter_rust_bridge::for_generated::RustAutoOpaqueBase<T,
        MoiArc<::flutter_rust_bridge::for_generated::RustAutoOpaqueInner<T>>>;
    /// Usually this is unneeded, and just write down arbitrary types.
    /// However, when you need arbitrary types at places that are not supported yet,
    /// use `RustOpaqueOpaque<YourArbitraryType>`.
    pub type RustAutoOpaque<T> = RustAutoOpaqueMoi<T>;
    pub trait CstDecode<T> {
        fn cst_decode(self)
        -> T;
    }
    impl<T, S> CstDecode<Option<T>> for *mut S where *mut S: CstDecode<T> {
        fn cst_decode(self) -> Option<T> {
            (!self.is_null()).then(|| self.cst_decode())
        }
    }
    pub trait SseDecode {
        fn sse_decode(deserializer:
            &mut ::flutter_rust_bridge::for_generated::SseDeserializer)
        -> Self;
        fn sse_decode_single(message:
                ::flutter_rust_bridge::for_generated::Dart2RustMessageSse)
            -> Self where Self: Sized {
            let mut deserializer =
                ::flutter_rust_bridge::for_generated::SseDeserializer::new(message);
            let ans = Self::sse_decode(&mut deserializer);
            deserializer.end();
            ans
        }
    }
    pub trait SseEncode {
        fn sse_encode(self,
        serializer: &mut ::flutter_rust_bridge::for_generated::SseSerializer);
    }
    fn transform_result_sse<T, E>(raw: Result<T, E>)
        ->
            Result<::flutter_rust_bridge::for_generated::Rust2DartMessageSse,
            ::flutter_rust_bridge::for_generated::Rust2DartMessageSse> where
        T: SseEncode, E: SseEncode {
        use ::flutter_rust_bridge::for_generated::{Rust2DartAction, SseCodec};
        match raw {
            Ok(raw) =>
                Ok(SseCodec::encode(Rust2DartAction::Success,
                        |serializer| { raw.sse_encode(serializer) })),
            Err(raw) =>
                Err(SseCodec::encode(Rust2DartAction::Error,
                        |serializer| { raw.sse_encode(serializer) })),
        }
    }
    pub struct StreamSink<T,
        Rust2DartCodec: ::flutter_rust_bridge::for_generated::BaseCodec =
        ::flutter_rust_bridge::for_generated::SseCodec> {
        base: ::flutter_rust_bridge::for_generated::StreamSinkBase<T,
        Rust2DartCodec>,
    }
    #[automatically_derived]
    impl<T: ::core::clone::Clone, Rust2DartCodec: ::core::clone::Clone +
        ::flutter_rust_bridge::for_generated::BaseCodec> ::core::clone::Clone
        for StreamSink<T, Rust2DartCodec> {
        #[inline]
        fn clone(&self) -> StreamSink<T, Rust2DartCodec> {
            StreamSink { base: ::core::clone::Clone::clone(&self.base) }
        }
    }
    impl<T, Rust2DartCodec: ::flutter_rust_bridge::for_generated::BaseCodec>
        StreamSink<T, Rust2DartCodec> {
        pub fn deserialize(raw: String) -> Self {
            Self {
                base: ::flutter_rust_bridge::for_generated::StreamSinkBase::deserialize(raw),
            }
        }
    }
    impl<T> StreamSink<T, ::flutter_rust_bridge::for_generated::DcoCodec> {
        pub fn add<T2>(&self, value: T)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> where
            T: ::flutter_rust_bridge::IntoIntoDart<T2>,
            T2: ::flutter_rust_bridge::IntoDart {
            self.base.add(::flutter_rust_bridge::for_generated::DcoCodec::encode(::flutter_rust_bridge::for_generated::Rust2DartAction::Success,
                    value.into_into_dart()))
        }
    }
    impl<T> StreamSink<T, ::flutter_rust_bridge::for_generated::SseCodec>
        where T: SseEncode {
        pub fn add(&self, value: T)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> {
            self.base.add(::flutter_rust_bridge::for_generated::SseCodec::encode(::flutter_rust_bridge::for_generated::Rust2DartAction::Success,
                    |serializer| value.sse_encode(serializer)))
        }
    }
    impl<T, Rust2DartCodec: ::flutter_rust_bridge::for_generated::BaseCodec>
        ::flutter_rust_bridge::IntoIntoDart<StreamSink<T, Rust2DartCodec>> for
        StreamSink<T, Rust2DartCodec> {
        fn into_into_dart(self) -> StreamSink<T, Rust2DartCodec> {
            ::core::panicking::panic("internal error: entered unreachable code")
        }
    }
    impl<T, Rust2DartCodec: ::flutter_rust_bridge::for_generated::BaseCodec>
        ::flutter_rust_bridge::IntoDart for StreamSink<T, Rust2DartCodec> {
        fn into_dart(self) -> ::flutter_rust_bridge::for_generated::DartAbi {
            ::core::panicking::panic("internal error: entered unreachable code")
        }
    }
    pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str =
        "2.0.0-dev.33";
    pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 11155725;
    #[allow(missing_copy_implementations)]
    #[allow(non_camel_case_types)]
    #[allow(dead_code)]
    pub struct FLUTTER_RUST_BRIDGE_HANDLER {
        __private_field: (),
    }
    #[doc(hidden)]
    pub static FLUTTER_RUST_BRIDGE_HANDLER: FLUTTER_RUST_BRIDGE_HANDLER =
        FLUTTER_RUST_BRIDGE_HANDLER { __private_field: () };
    impl ::lazy_static::__Deref for FLUTTER_RUST_BRIDGE_HANDLER {
        type Target =
            ::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool>;
        fn deref(&self)
            ->
                &::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool> {
            #[inline(always)]
            fn __static_ref_initialize()
                ->
                    ::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool> {
                {
                    match (&FLUTTER_RUST_BRIDGE_CODEGEN_VERSION,
                            &flutter_rust_bridge::for_generated::FLUTTER_RUST_BRIDGE_RUNTIME_VERSION)
                        {
                        (left_val, right_val) => {
                            if !(*left_val == *right_val) {
                                    let kind = ::core::panicking::AssertKind::Eq;
                                    ::core::panicking::assert_failed(kind, &*left_val,
                                        &*right_val,
                                        ::core::option::Option::Some(format_args!("Please ensure flutter_rust_bridge\'s codegen ({0}) and runtime ({1}) versions are the same",
                                                FLUTTER_RUST_BRIDGE_CODEGEN_VERSION,
                                                flutter_rust_bridge::for_generated::FLUTTER_RUST_BRIDGE_RUNTIME_VERSION)));
                                }
                        }
                    };
                    ::flutter_rust_bridge::DefaultHandler::new_simple(Default::default())
                }
            }
            #[inline(always)]
            fn __stability()
                ->
                    &'static ::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool> {
                static LAZY:
                    ::lazy_static::lazy::Lazy<::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool>>
                    =
                    ::lazy_static::lazy::Lazy::INIT;
                LAZY.get(__static_ref_initialize)
            }
            __stability()
        }
    }
    impl ::lazy_static::LazyStatic for FLUTTER_RUST_BRIDGE_HANDLER {
        fn initialize(lazy: &Self) { let _ = &**lazy; }
    }
    fn wire_greet_impl(port_: flutter_rust_bridge::for_generated::MessagePort,
        ptr_:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len_: i32, data_len_: i32) {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec,
            _,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "greet",
                port: Some(port_),
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
            },
            move ||
                {
                    let message =
                        unsafe {
                            flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                                rust_vec_len_, data_len_)
                        };
                    let mut deserializer =
                        flutter_rust_bridge::for_generated::SseDeserializer::new(message);
                    let api_name = <String>::sse_decode(&mut deserializer);
                    deserializer.end();
                    move |context|
                        {
                            transform_result_sse((move ||
                                            {
                                                Result::<_, ()>::Ok(crate::api::minimal::greet(api_name))
                                            })())
                        }
                })
    }
    fn wire_hallo_impl(ptr_:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len_: i32, data_len_: i32)
        -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::<flutter_rust_bridge::for_generated::SseCodec,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "hallo",
                port: None,
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync,
            },
            move ||
                {
                    let message =
                        unsafe {
                            flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                                rust_vec_len_, data_len_)
                        };
                    let mut deserializer =
                        flutter_rust_bridge::for_generated::SseDeserializer::new(message);
                    let api_name = <String>::sse_decode(&mut deserializer);
                    deserializer.end();
                    transform_result_sse((move ||
                                    {
                                        Result::<_, ()>::Ok(crate::api::minimal::hallo(api_name))
                                    })())
                })
    }
    fn wire_hey_impl(port_: flutter_rust_bridge::for_generated::MessagePort,
        ptr_:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len_: i32, data_len_: i32) {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec,
            _,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "hey",
                port: Some(port_),
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
            },
            move ||
                {
                    let message =
                        unsafe {
                            flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                                rust_vec_len_, data_len_)
                        };
                    let mut deserializer =
                        flutter_rust_bridge::for_generated::SseDeserializer::new(message);
                    let api_name = <String>::sse_decode(&mut deserializer);
                    deserializer.end();
                    move |context|
                        {
                            transform_result_sse((move ||
                                            {
                                                Result::<_, ()>::Ok(crate::api::minimal::hey(api_name))
                                            })())
                        }
                })
    }
    fn wire_init_app_impl(port_:
            flutter_rust_bridge::for_generated::MessagePort,
        ptr_:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len_: i32, data_len_: i32) {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec,
            _,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "init_app",
                port: Some(port_),
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
            },
            move ||
                {
                    let message =
                        unsafe {
                            flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                                rust_vec_len_, data_len_)
                        };
                    let mut deserializer =
                        flutter_rust_bridge::for_generated::SseDeserializer::new(message);
                    deserializer.end();
                    move |context|
                        {
                            transform_result_sse((move ||
                                            { Result::<_, ()>::Ok(crate::api::minimal::init_app()) })())
                        }
                })
    }
    fn wire_minimal_adder_impl(port_:
            flutter_rust_bridge::for_generated::MessagePort,
        ptr_:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len_: i32, data_len_: i32) {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec,
            _,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "minimal_adder",
                port: Some(port_),
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
            },
            move ||
                {
                    let message =
                        unsafe {
                            flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                                rust_vec_len_, data_len_)
                        };
                    let mut deserializer =
                        flutter_rust_bridge::for_generated::SseDeserializer::new(message);
                    let api_a = <i32>::sse_decode(&mut deserializer);
                    let api_b = <i32>::sse_decode(&mut deserializer);
                    deserializer.end();
                    move |context|
                        {
                            transform_result_sse((move ||
                                            {
                                                Result::<_,
                                                        ()>::Ok(crate::api::minimal::minimal_adder(api_a, api_b))
                                            })())
                        }
                })
    }
    fn wire_yo_impl(port_: flutter_rust_bridge::for_generated::MessagePort,
        ptr_:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len_: i32, data_len_: i32) {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec,
            _,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "yo",
                port: Some(port_),
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
            },
            move ||
                {
                    let message =
                        unsafe {
                            flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                                rust_vec_len_, data_len_)
                        };
                    let mut deserializer =
                        flutter_rust_bridge::for_generated::SseDeserializer::new(message);
                    let api_name = <String>::sse_decode(&mut deserializer);
                    deserializer.end();
                    move |context|
                        {
                            transform_result_sse((move ||
                                            {
                                                Result::<_, ()>::Ok(crate::api::minimal::yo(api_name))
                                            })())
                        }
                })
    }
    impl MoiArcValue for
        flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
        u32>>> {
        fn get_pool() -> &'static MoiArcPool<Self> {
            #[allow(missing_copy_implementations)]
            #[allow(non_camel_case_types)]
            #[allow(dead_code)]
            struct POOL {
                __private_field: (),
            }
            #[doc(hidden)]
            static POOL: POOL = POOL { __private_field: () };
            impl ::lazy_static::__Deref for POOL {
                type Target =
                    MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                    u32>>>>;
                fn deref(&self)
                    ->
                        &MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                        u32>>>> {
                    #[inline(always)]
                    fn __static_ref_initialize()
                        ->
                            MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                            u32>>>> {
                        MoiArcPool::new(Default::default())
                    }
                    #[inline(always)]
                    fn __stability()
                        ->
                            &'static MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                            u32>>>> {
                        static LAZY:
                            ::lazy_static::lazy::Lazy<MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                            u32>>>>> =
                            ::lazy_static::lazy::Lazy::INIT;
                        LAZY.get(__static_ref_initialize)
                    }
                    __stability()
                }
            }
            impl ::lazy_static::LazyStatic for POOL {
                fn initialize(lazy: &Self) { let _ = &**lazy; }
            }
            ;
            &POOL
        }
    }
    impl MoiArcValue for
        flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>
        {
        fn get_pool() -> &'static MoiArcPool<Self> {
            #[allow(missing_copy_implementations)]
            #[allow(non_camel_case_types)]
            #[allow(dead_code)]
            struct POOL {
                __private_field: (),
            }
            #[doc(hidden)]
            static POOL: POOL = POOL { __private_field: () };
            impl ::lazy_static::__Deref for POOL {
                type Target =
                    MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>;
                fn deref(&self)
                    ->
                        &MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>> {
                    #[inline(always)]
                    fn __static_ref_initialize()
                        ->
                            MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>> {
                        MoiArcPool::new(Default::default())
                    }
                    #[inline(always)]
                    fn __stability()
                        ->
                            &'static MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>> {
                        static LAZY:
                            ::lazy_static::lazy::Lazy<MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>>
                            =
                            ::lazy_static::lazy::Lazy::INIT;
                        LAZY.get(__static_ref_initialize)
                    }
                    __stability()
                }
            }
            impl ::lazy_static::LazyStatic for POOL {
                fn initialize(lazy: &Self) { let _ = &**lazy; }
            }
            ;
            &POOL
        }
    }
    impl MoiArcValue for
        flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
        = Result<String, u32>> + Send + 'static>>> {
        fn get_pool() -> &'static MoiArcPool<Self> {
            #[allow(missing_copy_implementations)]
            #[allow(non_camel_case_types)]
            #[allow(dead_code)]
            struct POOL {
                __private_field: (),
            }
            #[doc(hidden)]
            static POOL: POOL = POOL { __private_field: () };
            impl ::lazy_static::__Deref for POOL {
                type Target =
                    MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                    = Result<String, u32>> + Send + 'static>>>>;
                fn deref(&self)
                    ->
                        &MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                        = Result<String, u32>> + Send + 'static>>>> {
                    #[inline(always)]
                    fn __static_ref_initialize()
                        ->
                            MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                            = Result<String, u32>> + Send + 'static>>>> {
                        MoiArcPool::new(Default::default())
                    }
                    #[inline(always)]
                    fn __stability()
                        ->
                            &'static MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                            = Result<String, u32>> + Send + 'static>>>> {
                        static LAZY:
                            ::lazy_static::lazy::Lazy<MoiArcPool<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                            = Result<String, u32>> + Send + 'static>>>>> =
                            ::lazy_static::lazy::Lazy::INIT;
                        LAZY.get(__static_ref_initialize)
                    }
                    __stability()
                }
            }
            impl ::lazy_static::LazyStatic for POOL {
                fn initialize(lazy: &Self) { let _ = &**lazy; }
            }
            ;
            &POOL
        }
    }
    impl SseDecode for DartFnFuture<Result<String, u32>> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner =
                <RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                        u32>>>>>::sse_decode(deserializer);
            return inner.rust_auto_opaque_decode_owned();
        }
    }
    impl SseDecode for DartFnFuture<String> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner =
                <RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>>::sse_decode(deserializer);
            return inner.rust_auto_opaque_decode_owned();
        }
    }
    impl SseDecode for
        Pin<Box<dyn Future<Output = Result<String, u32>> + Send + 'static>> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner =
                <RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                        = Result<String, u32>> + Send +
                        'static>>>>>::sse_decode(deserializer);
            return inner.rust_auto_opaque_decode_owned();
        }
    }
    impl SseDecode for
        RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
        u32>>>> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner = <usize>::sse_decode(deserializer);
            return decode_rust_opaque_moi(inner);
        }
    }
    impl SseDecode for
        RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>
        {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner = <usize>::sse_decode(deserializer);
            return decode_rust_opaque_moi(inner);
        }
    }
    impl SseDecode for
        RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
        = Result<String, u32>> + Send + 'static>>>> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner = <usize>::sse_decode(deserializer);
            return decode_rust_opaque_moi(inner);
        }
    }
    impl SseDecode for String {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner = <Vec<u8>>::sse_decode(deserializer);
            return String::from_utf8(inner).unwrap();
        }
    }
    impl SseDecode for i32 {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_i32::<NativeEndian>().unwrap()
        }
    }
    impl SseDecode for Vec<u8> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut len_ = <i32>::sse_decode(deserializer);
            let mut ans_ = ::alloc::vec::Vec::new();
            for idx_ in 0..len_ { ans_.push(<u8>::sse_decode(deserializer)); }
            return ans_;
        }
    }
    impl SseDecode for u8 {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_u8().unwrap()
        }
    }
    impl SseDecode for () {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {}
    }
    impl SseDecode for usize {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_u64::<NativeEndian>().unwrap() as _
        }
    }
    impl SseDecode for bool {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_u8().unwrap() != 0
        }
    }
    fn pde_ffi_dispatcher_primary_impl(func_id: i32,
        port: flutter_rust_bridge::for_generated::MessagePort,
        ptr:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len: i32, data_len: i32) {
        match func_id {
            3 => wire_greet_impl(port, ptr, rust_vec_len, data_len),
            4 => wire_hey_impl(port, ptr, rust_vec_len, data_len),
            1 => wire_init_app_impl(port, ptr, rust_vec_len, data_len),
            2 => wire_minimal_adder_impl(port, ptr, rust_vec_len, data_len),
            5 => wire_yo_impl(port, ptr, rust_vec_len, data_len),
            _ =>
                ::core::panicking::panic("internal error: entered unreachable code"),
        }
    }
    fn pde_ffi_dispatcher_sync_impl(func_id: i32,
        ptr:
            flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
        rust_vec_len: i32, data_len: i32)
        -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
        match func_id {
            6 => wire_hallo_impl(ptr, rust_vec_len, data_len),
            _ =>
                ::core::panicking::panic("internal error: entered unreachable code"),
        }
    }
    impl flutter_rust_bridge::IntoDart for
        FrbWrapper<DartFnFuture<Result<String, u32>>> {
        fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
            flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_,
                        MoiArc<_>>(self.0).into_dart()
        }
    }
    impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for
        FrbWrapper<DartFnFuture<Result<String, u32>>> {}
    impl flutter_rust_bridge::IntoIntoDart<FrbWrapper<DartFnFuture<Result<String,
        u32>>>> for DartFnFuture<Result<String, u32>> {
        fn into_into_dart(self)
            -> FrbWrapper<DartFnFuture<Result<String, u32>>> {
            self.into()
        }
    }
    impl flutter_rust_bridge::IntoDart for FrbWrapper<DartFnFuture<String>> {
        fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
            flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_,
                        MoiArc<_>>(self.0).into_dart()
        }
    }
    impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for
        FrbWrapper<DartFnFuture<String>> {}
    impl flutter_rust_bridge::IntoIntoDart<FrbWrapper<DartFnFuture<String>>>
        for DartFnFuture<String> {
        fn into_into_dart(self) -> FrbWrapper<DartFnFuture<String>> {
            self.into()
        }
    }
    impl flutter_rust_bridge::IntoDart for
        FrbWrapper<Pin<Box<dyn Future<Output = Result<String, u32>> + Send +
        'static>>> {
        fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
            flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_,
                        MoiArc<_>>(self.0).into_dart()
        }
    }
    impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for
        FrbWrapper<Pin<Box<dyn Future<Output = Result<String, u32>> + Send +
        'static>>> {}
    impl flutter_rust_bridge::IntoIntoDart<FrbWrapper<Pin<Box<dyn Future<Output
        = Result<String, u32>> + Send + 'static>>>> for
        Pin<Box<dyn Future<Output = Result<String, u32>> + Send + 'static>> {
        fn into_into_dart(self)
            ->
                FrbWrapper<Pin<Box<dyn Future<Output = Result<String, u32>> +
                Send + 'static>>> {
            self.into()
        }
    }
    impl SseEncode for DartFnFuture<Result<String, u32>> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                    u32>>>>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_,
                        MoiArc<_>>(self), serializer);
        }
    }
    impl SseEncode for DartFnFuture<String> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_,
                        MoiArc<_>>(self), serializer);
        }
    }
    impl SseEncode for
        Pin<Box<dyn Future<Output = Result<String, u32>> + Send + 'static>> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                    = Result<String, u32>> + Send +
                    'static>>>>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_,
                        MoiArc<_>>(self), serializer);
        }
    }
    impl SseEncode for
        RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
        u32>>>> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            let (ptr, size) = self.sse_encode_raw();
            <usize>::sse_encode(ptr, serializer);
            <i32>::sse_encode(size, serializer);
        }
    }
    impl SseEncode for
        RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>
        {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            let (ptr, size) = self.sse_encode_raw();
            <usize>::sse_encode(ptr, serializer);
            <i32>::sse_encode(size, serializer);
        }
    }
    impl SseEncode for
        RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
        = Result<String, u32>> + Send + 'static>>>> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            let (ptr, size) = self.sse_encode_raw();
            <usize>::sse_encode(ptr, serializer);
            <i32>::sse_encode(size, serializer);
        }
    }
    impl SseEncode for String {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <Vec<u8>>::sse_encode(self.into_bytes(), serializer);
        }
    }
    impl SseEncode for i32 {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_i32::<NativeEndian>(self).unwrap();
        }
    }
    impl SseEncode for Vec<u8> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <i32>::sse_encode(self.len() as _, serializer);
            for item in self { <u8>::sse_encode(item, serializer); }
        }
    }
    impl SseEncode for u8 {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_u8(self).unwrap();
        }
    }
    impl SseEncode for () {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {}
    }
    impl SseEncode for usize {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_u64::<NativeEndian>(self as _).unwrap();
        }
    }
    impl SseEncode for bool {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_u8(self as _).unwrap();
        }
    }
    #[cfg(not(target_family = "wasm"))]
    #[path = "frb_generated.io.rs"]
    mod io {
        use super::*;
        use crate::api::minimal::*;
        use flutter_rust_bridge::for_generated::byteorder::{
            NativeEndian, ReadBytesExt, WriteBytesExt,
        };
        use flutter_rust_bridge::for_generated::transform_result_dco;
        use flutter_rust_bridge::{Handler, IntoIntoDart};
        pub trait NewWithNullPtr {
            fn new_with_null_ptr()
            -> Self;
        }
        impl<T> NewWithNullPtr for *mut T {
            fn new_with_null_ptr() -> Self { std::ptr::null_mut() }
        }
        #[no_mangle]
        pub extern "C" fn frb_get_rust_content_hash() -> i32 {
            FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH
        }
        #[no_mangle]
        pub extern "C" fn frb_pde_ffi_dispatcher_primary(func_id: i32,
            port_: i64, ptr_: *mut u8, rust_vec_len_: i32, data_len_: i32) {
            pde_ffi_dispatcher_primary_impl(func_id, port_, ptr_,
                rust_vec_len_, data_len_)
        }
        #[no_mangle]
        pub extern "C" fn frb_pde_ffi_dispatcher_sync(func_id: i32,
            ptr_: *mut u8, rust_vec_len_: i32, data_len_: i32)
            -> ::flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
            pde_ffi_dispatcher_sync_impl(func_id, ptr_, rust_vec_len_,
                data_len_)
        }
        #[no_mangle]
        pub extern "C" fn dart_fn_deliver_output(call_id: i32, ptr_: *mut u8,
            rust_vec_len_: i32, data_len_: i32) {
            let message =
                unsafe {
                    ::flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                        rust_vec_len_, data_len_)
                };
            FLUTTER_RUST_BRIDGE_HANDLER.dart_fn_handle_output(call_id,
                message)
        }
        #[no_mangle]
        pub extern "C" fn frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureResultStringu32(ptr:
                *const std::ffi::c_void) {
            MoiArc::<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                    u32>>>>::increment_strong_count(ptr as _);
        }
        #[no_mangle]
        pub extern "C" fn frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureResultStringu32(ptr:
                *const std::ffi::c_void) {
            MoiArc::<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<Result<String,
                    u32>>>>::decrement_strong_count(ptr as _);
        }
        #[no_mangle]
        pub extern "C" fn frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureString(ptr:
                *const std::ffi::c_void) {
            MoiArc::<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>::increment_strong_count(ptr
                    as _);
        }
        #[no_mangle]
        pub extern "C" fn frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureString(ptr:
                *const std::ffi::c_void) {
            MoiArc::<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<DartFnFuture<String>>>::decrement_strong_count(ptr
                    as _);
        }
        #[no_mangle]
        pub extern "C" fn frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPinBoxdynFutureOutputResultStringu32Sendstatic(ptr:
                *const std::ffi::c_void) {
            MoiArc::<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                    = Result<String, u32>> + Send +
                    'static>>>>::increment_strong_count(ptr as _);
        }
        #[no_mangle]
        pub extern "C" fn frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPinBoxdynFutureOutputResultStringu32Sendstatic(ptr:
                *const std::ffi::c_void) {
            MoiArc::<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Pin<Box<dyn Future<Output
                    = Result<String, u32>> + Send +
                    'static>>>>::decrement_strong_count(ptr as _);
        }
    }
    #[cfg(not(target_family = "wasm"))]
    pub use io::*;
}
 stderr=   Compiling libc v0.2.150
   Compiling proc-macro2 v1.0.78
   Compiling unicode-ident v1.0.12
    Checking memchr v2.6.4
   Compiling futures-core v0.3.29
   Compiling autocfg v1.1.0
   Compiling futures-channel v0.3.29
   Compiling futures-task v0.3.29
   Compiling futures-util v0.3.29
    Checking gimli v0.28.1
    Checking adler v1.0.2
    Checking futures-sink v0.3.29
   Compiling slab v0.4.9
    Checking pin-project-lite v0.2.13
    Checking object v0.32.1
    Checking miniz_oxide v0.7.1
    Checking rustc-demangle v0.1.23
   Compiling anyhow v1.0.75
    Checking cfg-if v1.0.0
    Checking futures-io v0.3.29
   Compiling quote v1.0.35
    Checking pin-utils v0.1.0
   Compiling cc v1.0.83
    Checking num_cpus v1.16.0
   Compiling build-target v0.4.0
   Compiling syn v2.0.48
   Compiling hex v0.4.3
    Checking atomic v0.5.3
   Compiling flutter_rust_bridge v2.0.0-dev.33 (/home/dirk/devel/flutter_rust_bridge/frb_rust)
    Checking tokio v1.34.0
    Checking threadpool v1.8.1
    Checking lazy_static v1.4.0
    Checking byteorder v1.5.0
    Checking log v0.4.20
   Compiling backtrace v0.3.69
   Compiling dart-sys-fork v4.1.1
    Checking addr2line v0.21.0
    Checking allo-isolate v0.1.24
   Compiling futures-macro v0.3.29
   Compiling delegate-attr v0.3.0
   Compiling flutter_rust_bridge_macros v2.0.0-dev.33 (/home/dirk/devel/flutter_rust_bridge/frb_macros)
    Checking futures-executor v0.3.29
    Checking futures v0.3.29
    Checking frb_example_dart_minimal v0.1.0 (/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust)
    Finished dev [unoptimized + debuginfo] target(s) in 8.12s

[2024-05-07T06:56:00.352Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping cargo_expand.rs into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/source/cargo_expand.rs"
[2024-05-07T06:56:00.357Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping read_rust_file/src/api/minimal.rs into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/source/read_rust_file/src/api/minimal.rs"
[2024-05-07T06:56:00.359Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/crates.rs:26] parse manifest_path="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/Cargo.toml"
[2024-05-07T06:56:00.438Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:31] parse START info=ModuleInfo { visibility: Public, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib.rs", module_path: ["crate"] }
[2024-05-07T06:56:00.438Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:150] parse_syn_item_mod module_path=["crate", "api"]
[2024-05-07T06:56:00.438Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:202] parse_syn_item_mod_contentless module_path=["crate", "api"]
[2024-05-07T06:56:00.438Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:205] file_path_candidates "api" "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib.rs" ["/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/mod.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib/api.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib/api/mod.rs"]
[2024-05-07T06:56:00.438Z DEBUG frb_codegen/src/library/codegen/parser/reader.rs:22] read_rust_file rust_file_path="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/mod.rs" module=Some("api")
[2024-05-07T06:56:00.438Z DEBUG frb_codegen/src/library/commands/cargo_expand.rs:31] CachedCargoExpand execute manifest_dir= rust_crate_dir="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust"
[2024-05-07T06:56:00.440Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping read_rust_file/src/api/mod.rs into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/source/read_rust_file/src/api/mod.rs"
[2024-05-07T06:56:00.440Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:216] Trying to parse "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/mod.rs"
[2024-05-07T06:56:00.442Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:31] parse START info=ModuleInfo { visibility: Public, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/mod.rs", module_path: ["crate", "api"] }
[2024-05-07T06:56:00.442Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:150] parse_syn_item_mod module_path=["crate", "api", "minimal"]
[2024-05-07T06:56:00.442Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:180] parse_syn_item_mod_contentful module_path=["crate", "api", "minimal"]
[2024-05-07T06:56:00.442Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:31] parse START info=ModuleInfo { visibility: Public, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/mod.rs", module_path: ["crate", "api", "minimal"] }
[2024-05-07T06:56:00.443Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:77] parse END info=ModuleInfo { visibility: Public, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/mod.rs", module_path: ["crate", "api", "minimal"] }
[2024-05-07T06:56:00.443Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:77] parse END info=ModuleInfo { visibility: Public, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/api/mod.rs", module_path: ["crate", "api"] }
[2024-05-07T06:56:00.443Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:150] parse_syn_item_mod module_path=["crate", "frb_generated"]
[2024-05-07T06:56:00.443Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:202] parse_syn_item_mod_contentless module_path=["crate", "frb_generated"]
[2024-05-07T06:56:00.443Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:205] file_path_candidates "frb_generated" "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib.rs" ["/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated/mod.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib/frb_generated.rs", "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib/frb_generated/mod.rs"]
[2024-05-07T06:56:00.443Z DEBUG frb_codegen/src/library/codegen/parser/reader.rs:22] read_rust_file rust_file_path="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs" module=Some("frb_generated")
[2024-05-07T06:56:00.443Z DEBUG frb_codegen/src/library/commands/cargo_expand.rs:31] CachedCargoExpand execute manifest_dir= rust_crate_dir="/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust"
[2024-05-07T06:56:00.446Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping read_rust_file/src/frb_generated.rs into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/source/read_rust_file/src/frb_generated.rs"
[2024-05-07T06:56:00.447Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:216] Trying to parse "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs"
[2024-05-07T06:56:00.499Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:31] parse START info=ModuleInfo { visibility: Inherited, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", module_path: ["crate", "frb_generated"] }
[2024-05-07T06:56:00.499Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:101] parse_syn_item_struct_or_enum item_ident=Ident { sym: FrbWrapper, span: bytes(4000..4010) }
[2024-05-07T06:56:00.499Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:101] parse_syn_item_struct_or_enum item_ident=Ident { sym: MoiArc, span: bytes(4674..4680) }
[2024-05-07T06:56:00.499Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:124] parse_syn_item_struct_or_enum item_type=ItemType { attrs: [], vis: Visibility::Inherited, type_token: Type, ident: Ident { sym: ObjectId, span: bytes(8500..8508) }, generics: Generics { lt_token: None, params: [], gt_token: None, where_clause: None }, eq_token: Eq, ty: Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: usize, span: bytes(8511..8516) }, arguments: PathArguments::None }] } }, semi_token: Semi }
[2024-05-07T06:56:00.500Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:124] parse_syn_item_struct_or_enum item_type=ItemType { attrs: [], vis: Visibility::Public(Pub), type_token: Type, ident: Ident { sym: MoiArcPool, span: bytes(8531..8541) }, generics: Generics { lt_token: Some(Lt), params: [GenericParam::Type(TypeParam { attrs: [], ident: Ident { sym: T, span: bytes(8542..8543) }, colon_token: None, bounds: [], eq_token: None, default: None })], gt_token: Some(Gt), where_clause: None }, eq_token: Eq, ty: Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: std, span: bytes(8547..8550) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: sync, span: bytes(8552..8556) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: RwLock, span: bytes(8558..8564) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: MoiArcPoolInner, span: bytes(8565..8580) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: T, span: bytes(8581..8582) }, arguments: PathArguments::None }] } })], gt_token: Gt } }] } })], gt_token: Gt } }] } }, semi_token: Semi }
[2024-05-07T06:56:00.500Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:101] parse_syn_item_struct_or_enum item_ident=Ident { sym: MoiArcPoolInner, span: bytes(8601..8616) }
[2024-05-07T06:56:00.500Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:101] parse_syn_item_struct_or_enum item_ident=Ident { sym: IdGenerator, span: bytes(8909..8920) }
[2024-05-07T06:56:00.500Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:101] parse_syn_item_struct_or_enum item_ident=Ident { sym: MoiArcPoolValue, span: bytes(9493..9508) }
[2024-05-07T06:56:00.500Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:124] parse_syn_item_struct_or_enum item_type=ItemType { attrs: [Attribute { pound_token: Pound, style: AttrStyle::Outer, bracket_token: Bracket, meta: Meta::NameValue { path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: doc, span: bytes(9917..9958) }, arguments: PathArguments::None }] }, eq_token: Eq, value: Expr::Lit { attrs: [], lit: Lit::Str { token: " Please refer to `RustOpaque` for doc." } } } }], vis: Visibility::Public(Pub), type_token: Type, ident: Ident { sym: RustOpaqueMoi, span: bytes(9972..9985) }, generics: Generics { lt_token: Some(Lt), params: [GenericParam::Type(TypeParam { attrs: [], ident: Ident { sym: T, span: bytes(9986..9987) }, colon_token: None, bounds: [], eq_token: None, default: None })], gt_token: Some(Gt), where_clause: None }, eq_token: Eq, ty: Type::Path { qself: None, path: Path { leading_colon: Some(PathSep), segments: [PathSegment { ident: Ident { sym: flutter_rust_bridge, span: bytes(10001..10020) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: for_generated, span: bytes(10022..10035) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: RustOpaqueBase, span: bytes(10037..10051) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: T, span: bytes(10052..10053) }, arguments: PathArguments::None }] } }), Comma, GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: MoiArc, span: bytes(10055..10061) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: T, span: bytes(10062..10063) }, arguments: PathArguments::None }] } })], gt_token: Gt } }] } })], gt_token: Gt } }] } }, semi_token: Semi }
[2024-05-07T06:56:00.500Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:124] parse_syn_item_struct_or_enum item_type=ItemType { attrs: [Attribute { pound_token: Pound, style: AttrStyle::Outer, bracket_token: Bracket, meta: Meta::NameValue { path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: doc, span: bytes(10071..10183) }, arguments: PathArguments::None }] }, eq_token: Eq, value: Expr::Lit { attrs: [], lit: Lit::Str { token: " A wrapper to support [arbitrary Rust types](https://cjycode.com/flutter_rust_bridge/guides/types/arbitrary)." } } } }], vis: Visibility::Public(Pub), type_token: Type, ident: Ident { sym: RustOpaque, span: bytes(10197..10207) }, generics: Generics { lt_token: Some(Lt), params: [GenericParam::Type(TypeParam { attrs: [], ident: Ident { sym: T, span: bytes(10208..10209) }, colon_token: None, bounds: [], eq_token: None, default: None })], gt_token: Some(Gt), where_clause: None }, eq_token: Eq, ty: Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: RustOpaqueMoi, span: bytes(10213..10226) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: T, span: bytes(10227..10228) }, arguments: PathArguments::None }] } })], gt_token: Gt } }] } }, semi_token: Semi }
[2024-05-07T06:56:00.501Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:124] parse_syn_item_struct_or_enum item_type=ItemType { attrs: [Attribute { pound_token: Pound, style: AttrStyle::Outer, bracket_token: Bracket, meta: Meta::NameValue { path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: doc, span: bytes(10285..10330) }, arguments: PathArguments::None }] }, eq_token: Eq, value: Expr::Lit { attrs: [], lit: Lit::Str { token: " Please refer to `RustAutoOpaque` for doc." } } } }], vis: Visibility::Public(Pub), type_token: Type, ident: Ident { sym: RustAutoOpaqueMoi, span: bytes(10344..10361) }, generics: Generics { lt_token: Some(Lt), params: [GenericParam::Type(TypeParam { attrs: [], ident: Ident { sym: T, span: bytes(10362..10363) }, colon_token: None, bounds: [], eq_token: None, default: None })], gt_token: Some(Gt), where_clause: None }, eq_token: Eq, ty: Type::Path { qself: None, path: Path { leading_colon: Some(PathSep), segments: [PathSegment { ident: Ident { sym: flutter_rust_bridge, span: bytes(10377..10396) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: for_generated, span: bytes(10398..10411) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: RustAutoOpaqueBase, span: bytes(10413..10431) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: T, span: bytes(10432..10433) }, arguments: PathArguments::None }] } }), Comma, GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: MoiArc, span: bytes(10443..10449) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: Some(PathSep), segments: [PathSegment { ident: Ident { sym: flutter_rust_bridge, span: bytes(10452..10471) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: for_generated, span: bytes(10473..10486) }, arguments: PathArguments::None }, PathSep, PathSegment { ident: Ident { sym: RustAutoOpaqueInner, span: bytes(10488..10507) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: T, span: bytes(10508..10509) }, arguments: PathArguments::None }] } })], gt_token: Gt } }] } })], gt_token: Gt } }] } })], gt_token: Gt } }] } }, semi_token: Semi }
[2024-05-07T06:56:00.501Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:124] parse_syn_item_struct_or_enum item_type=ItemType { attrs: [Attribute { pound_token: Pound, style: AttrStyle::Outer, bracket_token: Bracket, meta: Meta::NameValue { path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: doc, span: bytes(10518..10584) }, arguments: PathArguments::None }] }, eq_token: Eq, value: Expr::Lit { attrs: [], lit: Lit::Str { token: " Usually this is unneeded, and just write down arbitrary types." } } } }, Attribute { pound_token: Pound, style: AttrStyle::Outer, bracket_token: Bracket, meta: Meta::NameValue { path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: doc, span: bytes(10589..10669) }, arguments: PathArguments::None }] }, eq_token: Eq, value: Expr::Lit { attrs: [], lit: Lit::Str { token: " However, when you need arbitrary types at places that are not supported yet," } } } }, Attribute { pound_token: Pound, style: AttrStyle::Outer, bracket_token: Bracket, meta: Meta::NameValue { path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: doc, span: bytes(10674..10720) }, arguments: PathArguments::None }] }, eq_token: Eq, value: Expr::Lit { attrs: [], lit: Lit::Str { token: " use `RustOpaqueOpaque<YourArbitraryType>`." } } } }], vis: Visibility::Public(Pub), type_token: Type, ident: Ident { sym: RustAutoOpaque, span: bytes(10734..10748) }, generics: Generics { lt_token: Some(Lt), params: [GenericParam::Type(TypeParam { attrs: [], ident: Ident { sym: T, span: bytes(10749..10750) }, colon_token: None, bounds: [], eq_token: None, default: None })], gt_token: Some(Gt), where_clause: None }, eq_token: Eq, ty: Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: RustAutoOpaqueMoi, span: bytes(10754..10771) }, arguments: PathArguments::AngleBracketed { colon2_token: None, lt_token: Lt, args: [GenericArgument::Type(Type::Path { qself: None, path: Path { leading_colon: None, segments: [PathSegment { ident: Ident { sym: T, span: bytes(10772..10773) }, arguments: PathArguments::None }] } })], gt_token: Gt } }] } }, semi_token: Semi }
[2024-05-07T06:56:00.501Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:101] parse_syn_item_struct_or_enum item_ident=Ident { sym: StreamSink, span: bytes(12429..12439) }
[2024-05-07T06:56:00.501Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:101] parse_syn_item_struct_or_enum item_ident=Ident { sym: FLUTTER_RUST_BRIDGE_HANDLER, span: bytes(15287..15314) }
[2024-05-07T06:56:00.501Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:150] parse_syn_item_mod module_path=["crate", "frb_generated", "io"]
[2024-05-07T06:56:00.501Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:180] parse_syn_item_mod_contentful module_path=["crate", "frb_generated", "io"]
[2024-05-07T06:56:00.502Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:31] parse START info=ModuleInfo { visibility: Inherited, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", module_path: ["crate", "frb_generated", "io"] }
[2024-05-07T06:56:00.502Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:77] parse END info=ModuleInfo { visibility: Inherited, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", module_path: ["crate", "frb_generated", "io"] }
[2024-05-07T06:56:00.506Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:77] parse END info=ModuleInfo { visibility: Inherited, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/frb_generated.rs", module_path: ["crate", "frb_generated"] }
[2024-05-07T06:56:00.508Z DEBUG frb_codegen/src/library/codegen/parser/source_graph/module_parser.rs:77] parse END info=ModuleInfo { visibility: Public, file_path: "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/src/lib.rs", module_path: ["crate"] }
[2024-05-07T06:56:00.510Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping source_graph.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/source_graph/source_graph.json"
[2024-05-07T06:56:00.511Z DEBUG frb_codegen/src/library/codegen/parser/function_parser/mod.rs:70] parse_function function name: Ident { sym: init_app, span: bytes(202..210) }
[2024-05-07T06:56:00.512Z DEBUG frb_codegen/src/library/codegen/parser/function_parser/mod.rs:70] parse_function function name: Ident { sym: minimal_adder, span: bytes(281..294) }
[2024-05-07T06:56:00.512Z DEBUG frb_codegen/src/library/codegen/parser/function_parser/mod.rs:70] parse_function function name: Ident { sym: greet, span: bytes(343..348) }
[2024-05-07T06:56:00.512Z DEBUG frb_codegen/src/library/codegen/parser/function_parser/mod.rs:70] parse_function function name: Ident { sym: hey, span: bytes(629..632) }
[2024-05-07T06:56:00.513Z DEBUG frb_codegen/src/library/codegen/parser/function_parser/mod.rs:70] parse_function function name: Ident { sym: yo, span: bytes(1017..1019) }
[2024-05-07T06:56:00.513Z DEBUG frb_codegen/src/library/codegen/parser/function_parser/mod.rs:70] parse_function function name: Ident { sym: hallo, span: bytes(1288..1293) }
[2024-05-07T06:56:00.524Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping ir_pack.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/ir/ir_pack.json"
[2024-05-07T06:56:00.539Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping api_dart.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_info/api_dart.json"
[2024-05-07T06:56:00.548Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping api_dart.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_spec/api_dart.json"
[2024-05-07T06:56:00.548Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping api_dart/api/minimal.dart into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/api_dart/api/minimal.dart"
[2024-05-07T06:56:00.554Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_rust.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_info/wire_rust.json"
[2024-05-07T06:56:00.558Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_rust.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_spec/wire_rust.json"
[2024-05-07T06:56:00.559Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_rust/Common.rs into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/wire_rust/Common.rs"
[2024-05-07T06:56:00.559Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_rust/Io.rs into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/wire_rust/Io.rs"
[2024-05-07T06:56:00.559Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_rust/Web.rs into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/wire_rust/Web.rs"
[2024-05-07T06:56:00.560Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_c.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_spec/wire_c.json"
[2024-05-07T06:56:00.560Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_c/content.h into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/wire_c/content.h"
[2024-05-07T06:56:00.566Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_dart.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_info/wire_dart.json"
[2024-05-07T06:56:00.580Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_dart.json into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_spec/wire_dart.json"
[2024-05-07T06:56:00.581Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_dart/Common.dart into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/wire_dart/Common.dart"
[2024-05-07T06:56:00.581Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_dart/Io.dart into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/wire_dart/Io.dart"
[2024-05-07T06:56:00.581Z DEBUG frb_codegen/src/library/codegen/dumper/mod.rs:97] Dumping wire_dart/Web.dart into "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust/target/frb_dump/generator_text/wire_dart/Web.dart"
[2024-05-07T06:56:00.583Z DEBUG frb_codegen/src/library/commands/format_dart.rs:13] execute format_dart paths=["lib/src/rust/api/minimal.dart", "lib/src/rust/frb_generated.dart", "lib/src/rust/frb_generated.io.dart", "lib/src/rust/frb_generated.web.dart"] line_length=80
[2024-05-07T06:56:00.583Z DEBUG frb_codegen/src/library/commands/command_runner.rs:129] execute command: bin=sh args="-c \"dart\" \"format\" \"--line-length\" \"80\" \"lib/src/rust/api/minimal.dart\" \"lib/src/rust/frb_generated.dart\" \"lib/src/rust/frb_generated.io.dart\" \"lib/src/rust/frb_generated.web.dart\"" current_dir=Some("/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal") cmd=cd "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal" && "sh" "-c" "\"dart\" \"format\" \"--line-length\" \"80\" \"lib/src/rust/api/minimal.dart\" \"lib/src/rust/frb_generated.dart\" \"lib/src/rust/frb_generated.io.dart\" \"lib/src/rust/frb_generated.web.dart\""
[2024-05-07T06:56:01.051Z DEBUG frb_codegen/src/library/commands/command_runner.rs:140] command=cd "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal" && "sh" "-c" "\"dart\" \"format\" \"--line-length\" \"80\" \"lib/src/rust/api/minimal.dart\" \"lib/src/rust/frb_generated.dart\" \"lib/src/rust/frb_generated.io.dart\" \"lib/src/rust/frb_generated.web.dart\"" stdout=Formatted lib/src/rust/api/minimal.dart
Formatted lib/src/rust/frb_generated.dart
Formatted lib/src/rust/frb_generated.io.dart
Formatted lib/src/rust/frb_generated.web.dart
Formatted 4 files (4 changed) in 0.32 seconds.
 stderr=
[2024-05-07T06:56:01.052Z DEBUG frb_codegen/src/library/commands/format_rust.rs:9] execute format_rust paths=["src/frb_generated.rs", "src/frb_generated.io.rs", "src/frb_generated.web.rs"]
[2024-05-07T06:56:01.052Z DEBUG frb_codegen/src/library/commands/command_runner.rs:129] execute command: bin=sh args="-c \"rustfmt\" \"--edition\" \"2018\" \"src/frb_generated.rs\" \"src/frb_generated.io.rs\" \"src/frb_generated.web.rs\"" current_dir=Some("/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust") cmd=cd "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust" && "sh" "-c" "\"rustfmt\" \"--edition\" \"2018\" \"src/frb_generated.rs\" \"src/frb_generated.io.rs\" \"src/frb_generated.web.rs\""
[2024-05-07T06:56:01.102Z DEBUG frb_codegen/src/library/commands/command_runner.rs:140] command=cd "/home/dirk/devel/flutter_rust_bridge/frb_example/dart_minimal/rust" && "sh" "-c" "\"rustfmt\" \"--edition\" \"2018\" \"src/frb_generated.rs\" \"src/frb_generated.io.rs\" \"src/frb_generated.web.rs\"" stdout= stderr=Warning: can't set `group_imports = One`, unstable features are only available in nightly channel.
Warning: can't set `group_imports = One`, unstable features are only available in nightly channel.
Warning: can't set `group_imports = One`, unstable features are only available in nightly channel.

Done!

Expected behavior

Functions returning a Future should be interpreted as async

Generated binding code

#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
// EXTRA BEGIN
typedef struct DartCObject *WireSyncRust2DartDco;
typedef struct WireSyncRust2DartSse {
  uint8_t *ptr;
  int32_t len;
} WireSyncRust2DartSse;

typedef int64_t DartPort;
typedef bool (*DartPostCObjectFnType)(DartPort port_id, void *message);
void store_dart_post_cobject(DartPostCObjectFnType ptr);
// EXTRA END
typedef struct _Dart_Handle* Dart_Handle;

typedef struct wire_cst_list_prim_u_8_strict {
  uint8_t *ptr;
  int32_t len;
} wire_cst_list_prim_u_8_strict;

void frbgen_frb_example_dart_minimal_wire_greet(int64_t port_,
                                                struct wire_cst_list_prim_u_8_strict *name);

WireSyncRust2DartDco frbgen_frb_example_dart_minimal_wire_hallo(struct wire_cst_list_prim_u_8_strict *name);

void frbgen_frb_example_dart_minimal_wire_hey(int64_t port_,
                                              struct wire_cst_list_prim_u_8_strict *name);

void frbgen_frb_example_dart_minimal_wire_init_app(int64_t port_);

void frbgen_frb_example_dart_minimal_wire_minimal_adder(int64_t port_, int32_t a, int32_t b);

void frbgen_frb_example_dart_minimal_wire_yo(int64_t port_,
                                             struct wire_cst_list_prim_u_8_strict *name);

void frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureResultStringu32(const void *ptr);

void frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureResultStringu32(const void *ptr);

void frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureString(const void *ptr);

void frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureString(const void *ptr);

void frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPinBoxdynFutureOutputResultStringu32Sendstatic(const void *ptr);

void frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPinBoxdynFutureOutputResultStringu32Sendstatic(const void *ptr);

struct wire_cst_list_prim_u_8_strict *frbgen_frb_example_dart_minimal_cst_new_list_prim_u_8_strict(int32_t len);
static int64_t dummy_method_to_enforce_bundling(void) {
    int64_t dummy_var = 0;
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_cst_new_list_prim_u_8_strict);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureResultStringu32);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureString);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPinBoxdynFutureOutputResultStringu32Sendstatic);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureResultStringu32);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDartFnFutureString);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPinBoxdynFutureOutputResultStringu32Sendstatic);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_wire_greet);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_wire_hallo);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_wire_hey);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_wire_init_app);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_wire_minimal_adder);
    dummy_var ^= ((int64_t) (void*) frbgen_frb_example_dart_minimal_wire_yo);
    dummy_var ^= ((int64_t) (void*) store_dart_post_cobject);
    return dummy_var;
}

OS

Debian Trixie

Version of flutter_rust_bridge_codegen

master

Flutter info

[✓] Flutter (Channel stable, 3.19.6, on Debian GNU/Linux trixie/sid 6.6.15-amd64, locale en_IE.UTF-8)
    • Flutter version 3.19.6 on channel stable at /home/dirk/.local/share/mise/installs/flutter/3.19.5-stable
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 54e66469a9 (3 weeks ago), 2024-04-17 13:08:03 -0700
    • Engine revision c4cd48e186
    • Dart version 3.3.4
    • DevTools version 2.31.1

[!] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
    • Android SDK at /home/dirk/.local/share/android
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/linux#android-setup for more details.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Linux toolchain - develop for Linux desktop
    • Debian clang version 16.0.6 (20)
    • cmake version 3.28.3
    • ninja version 1.11.1
    • pkg-config version 1.8.1

[!] Android Studio (not installed)
    • Android Studio not found; download from https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions).

[✓] VS Code (version 1.88.1)
    • VS Code at /usr/share/code
    • Flutter extension version 3.46.0

[✓] Connected device (2 available)
    • Linux (desktop) • linux  • linux-x64      • Debian GNU/Linux trixie/sid 6.6.15-amd64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 124.0.6367.60

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 2 categories.

Version of clang++

16.0.6

Additional context

No response

fzyzcjy commented 3 weeks ago

Good point! Yes it was not considered before; but this should not be very hard to fix - just modify the parser slightly. Feel free to PR for it, alternatively I will fix it in the next batch or so!

fzyzcjy commented 3 weeks ago

(For completeness) Current workaround: Just use async keyword.

Btw I am curious, is there a reason to use Future instead of async?

vhdirk commented 3 weeks ago

Yes, there is: I want to store the callbacks in a struct for later use:


#[frb(opaque)]
pub struct NFCTransceiver {
    pub read_single_block_cb: Box<
        dyn Fn(u8, u32, Vec<u8>) -> DartFnFuture<NFCResult>
            + 'static
            + Send
            + Sync,
    >,
    pub write_single_block_cb: Box<
        dyn Fn(u8, u32, Vec<u8>) -> DartFnFuture<NFCResult>
            + 'static
            + Send
            + Sync,
    >,
    pub custom_command_cb: Box<
        dyn Fn(u8, u32, Vec<u8>) -> DartFnFuture<NFCResult>
            + 'static
            + Send
            + Sync,
    >,
}

impl NFCTransceiver {
    #[frb(sync)]
    pub fn new(
        read_single_block_cb: impl Fn(u8, u32, Vec<u8>) -> DartFnFuture<NFCResult>
            + 'static
            + Send
            + Sync,
        write_single_block_cb: impl Fn(u8, u32, Vec<u8>) -> DartFnFuture<NFCResult>
            + 'static
            + Send
            + Sync,
        custom_command_cb: impl Fn(u8, u32, Vec<u8>) -> DartFnFuture<NFCResult>
            + 'static
            + Send
            + Sync,
    ) -> Self {
        Self {
            read_single_block_cb: Box::new(read_single_block_cb),
            write_single_block_cb: Box::new(write_single_block_cb),
            custom_command_cb: Box::new(custom_command_cb),
        }
    }
}

impl NFC for NFCTransceiver {
...
}

And you can't do that with the async keyword

fzyzcjy commented 3 weeks ago

And you can't do that with the async keyword

A bit confused:

pub fn greet(name: String) -> DartFnFuture<Result<String, u32>> {
    future::ready(Ok(format!("Hello, {name}!")))
}

pub fn hey(name: String) -> Pin<Box<dyn Future<Output = Result<String, u32>> + Send + 'static>> {
    Box::pin(future::ready(Ok(format!("Hello, {name}!"))))
}

pub fn yo(name: String) -> DartFnFuture<String> {
    future::ready(format!("Hello, {name}!"))
}

#[frb(sync)]
pub fn hallo(name: String) -> DartFnFuture<String> {
    future::ready(format!("Hello, {name}!"))
}

pub async fn rust_function(dart_callback: impl Fn(String) -> DartFnFuture<Result<String, u32>>) {
    dart_callback(Ok("Tom".to_owned())).await; // Will get `Hello, Tom!`
}

Where do you want to use them? If I understand correctly, the use case is that,

// dart
NFCTransceiver(read_single_block_cb: greet);

where greet is a Dart function that is auto generated from the greet rust function.

Then, in that case, your Rust function just need to return normal things, i.e. pub fn greet() -> Result<String, u32> {}

fzyzcjy commented 2 weeks ago

So does the one above solve your question? If so, I guess there is no need to worry about explicit Future types.

fzyzcjy commented 2 weeks ago

Close because of inactivity, but feel free to reopen if this does not solve your problem!

github-actions[bot] commented 55 minutes ago

This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new issue.