Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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 opened this issue May 7, 2024 · 7 comments
Labels
bug Something isn't working

Comments

@vhdirk
Copy link

vhdirk commented May 7, 2024

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

@vhdirk vhdirk added the bug Something isn't working label May 7, 2024
@vhdirk vhdirk changed the title Returning a Future<Result<...>> is not translated into a Dart return/exception Returning a Future is not translated into an async Dart function May 7, 2024
@fzyzcjy
Copy link
Owner

fzyzcjy commented May 7, 2024

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
Copy link
Owner

fzyzcjy commented May 7, 2024

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

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

@vhdirk
Copy link
Author

vhdirk commented May 7, 2024

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
Copy link
Owner

fzyzcjy commented May 7, 2024

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 fzyzcjy added the awaiting Waiting for responses, PR, further discussions, upstream release, etc label May 15, 2024
@fzyzcjy
Copy link
Owner

fzyzcjy commented May 15, 2024

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

@fzyzcjy fzyzcjy removed the awaiting Waiting for responses, PR, further discussions, upstream release, etc label May 19, 2024
@fzyzcjy
Copy link
Owner

fzyzcjy commented May 19, 2024

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

@fzyzcjy fzyzcjy closed this as completed May 19, 2024
@fzyzcjy fzyzcjy closed this as not planned Won't fix, can't repro, duplicate, stale May 19, 2024
@fzyzcjy fzyzcjy changed the title Returning a Future is not translated into an async Dart function Returning a Future is not translated into an async Dart function (but can use return types directly without wrapping with a Future) May 19, 2024
Copy link
Contributor

github-actions bot commented Jun 2, 2024

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.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jun 2, 2024
@fzyzcjy fzyzcjy closed this as completed Jun 2, 2024
@fzyzcjy fzyzcjy closed this as not planned Won't fix, can't repro, duplicate, stale Jun 2, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants