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

Dart code generated for serializing HashSet<u64> fails to compile #2512

Open
domph opened this issue Jan 22, 2025 · 4 comments
Open

Dart code generated for serializing HashSet<u64> fails to compile #2512

domph opened this issue Jan 22, 2025 · 4 comments
Labels
awaiting Waiting for responses, PR, further discussions, upstream release, etc bug Something isn't working

Comments

@domph
Copy link

domph commented Jan 22, 2025

Describe the bug

It seems like serializing HashSet<u64> yields incorrect Dart code. This is with or without the --full-dep flag.

Steps to reproduce

In a brand new Flutter project (or inside the dart_minimal project), add the following:

use std::collections::HashSet;

#[flutter_rust_bridge::frb(sync)]
pub fn test(vals: HashSet<u64>) -> String {
    format!("{:?}", vals)
}

The frb_generated.dart file generates the following error:

lib/src/rust/frb_generated.dart:244:34: Error: The argument type 'List<BigInt>' can't be assigned to the parameter type 'List<int>'.
 - 'List' is from 'dart:core'.
 - 'BigInt' is from 'dart:core'.
        Uint64List.fromList(self.toList()), serializer);

It refers to this part of the frb_generated.dart file:

  @protected
  void sse_encode_Set_u_64(Set<BigInt> self, SseSerializer serializer) {
    // Codec=Sse (Serialization based), see doc to use other codecs
    sse_encode_list_prim_u_64_strict(
        Uint64List.fromList(self.toList()), serializer);
  }

Logs

RUST_LOG=debug flutter_rust_bridge_codegen generate
[2025-01-22T21:05:56.327Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src/main.rs:25] 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, dart_preamble: None, rust_preamble: 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, enable_lifetime: false, type_64bit_int: false, no_default_dart_async: false, stop_on_error: false, dump: None, dump_all: false, rust_features: None } }) }
[2025-01-22T21:05:56.328Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\config\config_parser.rs:51] Found config file flutter_rust_bridge.yaml
[2025-01-22T21:05:56.328Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\mod.rs:23] config=Config { base_dir: Some(""), rust_input: Some("crate::api"), dart_output: Some("lib/src/rust"), c_output: None, duplicated_c_output: None, rust_root: Some("rust/"), rust_output: None, dart_entrypoint_class_name: None, dart_format_line_length: None, dart_preamble: None, rust_preamble: 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: Some(true), local: None, default_external_library_loader_web_prefix: None, dart_type_rename: None, enable_lifetime: None, type_64bit_int: None, default_dart_async: None, stop_on_error: None, dump: None, dump_all: None, rust_features: None } meta_config=MetaConfig { watch: false }
[2025-01-22T21:05:56.328Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\config\internal_config_parser\mod.rs:33] InternalConfig.parse base_dir="C:\\dev\\frb_int"
[2025-01-22T21:05:56.580Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\mod.rs:26] internal_config=InternalConfig { controller: ControllerInternalConfig { watch: false, watching_paths: ["\\\\?\\C:\\dev\\frb_int\\rust\\src"], exclude_paths: ["\\\\?\\C:\\dev\\frb_int\\rust\\src\\frb_generated.rs"], max_count: None }, preparer: PreparerInternalConfig { dart_root: "\\\\?\\C:\\dev\\frb_int", deps_check: true, needs_ffigen: true }, parser: ParserInternalConfig { hir: ParserHirInternalConfig { rust_input_namespace_pack: RustInputNamespacePack { rust_input_namespace_prefixes: [Namespace { joined_path: "crate::api" }], rust_output_path_namespace: Namespace { joined_path: "crate::frb_generated" } }, rust_crate_dir: "\\\\?\\C:\\dev\\frb_int\\rust", third_party_crate_names: [], rust_features: None }, mir: ParserMirInternalConfig { rust_input_namespace_pack: RustInputNamespacePack { rust_input_namespace_prefixes: [Namespace { joined_path: "crate::api" }], rust_output_path_namespace: Namespace { joined_path: "crate::frb_generated" } }, force_codec_mode_pack: None, default_stream_sink_codec: Dco, default_rust_opaque_codec: Nom, stop_on_error: false, enable_lifetime: false, type_64bit_int: false, default_dart_async: true } }, generator: GeneratorInternalConfig { api_dart: GeneratorApiDartInternalConfig { dart_enums_style: true, dart3: true, dart_decl_base_output_path: "\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust", dart_impl_output_path: TargetOrCommonMap { common: "\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust\\frb_generated.dart", io: "\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust\\frb_generated.io.dart", web: "\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust\\frb_generated.web.dart" }, dart_entrypoint_class_name: "RustLib", dart_preamble: "", dart_type_rename: {} }, wire: GeneratorWireInternalConfig { dart: GeneratorWireDartInternalConfig { has_ffigen: true, 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: "\\\\?\\C:\\dev\\frb_int", extra_headers: "", dart_impl_output_path: TargetOrCommonMap { common: "\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust\\frb_generated.dart", io: "\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust\\frb_generated.io.dart", web: "\\\\?\\C:\\dev\\frb_int\\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: "rust_lib_frb_int", io_directory: "rust/target/release/", web_prefix: "pkg/" }, c_symbol_prefix: "frbgen_frb_int_" }, rust: GeneratorWireRustInternalConfig { rust_crate_dir: "\\\\?\\C:\\dev\\frb_int\\rust", web_enabled: true, rust_output_path: "\\\\?\\C:\\dev\\frb_int\\rust\\src\\frb_generated.rs", c_symbol_prefix: "frbgen_frb_int_", has_ffigen: true, default_stream_sink_codec: Dco, default_rust_opaque_codec: Nom, rust_preamble: "" }, c: GeneratorWireCInternalConfig { enable: true, rust_crate_dir: "\\\\?\\C:\\dev\\frb_int\\rust", rust_output_path: "\\\\?\\C:\\dev\\frb_int\\rust\\src\\frb_generated.rs", c_output_path: None, c_symbol_prefix: "frbgen_frb_int_" } } }, polisher: PolisherInternalConfig { duplicated_c_output_path: [], dart_format_line_length: 80, add_mod_to_lib: true, build_runner: true, web_enabled: true, dart_output: "\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust", dart_root: "\\\\?\\C:\\dev\\frb_int", rust_crate_dir: "\\\\?\\C:\\dev\\frb_int\\rust", rust_output_path: "\\\\?\\C:\\dev\\frb_int\\rust\\src\\frb_generated.rs", c_output_path: None, enable_auto_upgrade: true }, dumper: DumperInternalConfig { dump_contents: [], dump_directory: "\\\\?\\C:\\dev\\frb_int\\rust\\target\\frb_dump" } }
[2025-01-22T21:05:56.581Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\utils\dart_repository\dart_repo.rs:21] Guessing toolchain the runner is run into
[2025-01-22T21:05:56.581Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:129] execute command: bin=powershell args="-noprofile -command & \"fvm\" \"--version\"" current_dir=None cmd="powershell" "-noprofile" "-command" "& \"fvm\" \"--version\""
[2025-01-22T21:05:57.154Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:153] command="powershell" "-noprofile" "-command" "& \"fvm\" \"--version\"" stdout= stderr=& : The term 'fvm' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ & "fvm" "--version"
+   ~~~~~
    + CategoryInfo          : ObjectNotFound: (fvm:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 

[2025-01-22T21:05:57.155Z INFO C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\fvm.rs:15] Has .fvmrc but no fvm binary installation, thus skip using fvm.
[2025-01-22T21:05:57.155Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:129] execute command: bin=powershell args="-noprofile -command & \"flutter\" \"--version\"" current_dir=None cmd="powershell" "-noprofile" "-command" "& \"flutter\" \"--version\""
[2025-01-22T21:05:58.527Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:140] command="powershell" "-noprofile" "-command" "& \"flutter\" \"--version\"" stdout=Flutter 3.27.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 8495dee1fd (6 weeks ago) • 2024-12-10 14:23:39 -0800
Engine • revision 83bacfc525
Tools • Dart 3.6.0 • DevTools 2.40.2
 stderr=
[2025-01-22T21:05:58.527Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\utils\dart_repository\dart_repo.rs:68] Checking presence of ffigen in dev_dependencies at "\\\\?\\C:\\dev\\frb_int"
[2025-01-22T21:05:58.528Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\utils\dart_repository\dart_repo.rs:93] Checking presence of ffigen in dev_dependencies at "\\\\?\\C:\\dev\\frb_int"
[2025-01-22T21:05:58.530Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\cargo_expand\mod.rs:27] run_cargo_expand manifest_dir= rust_crate_dir="\\\\?\\C:\\dev\\frb_int\\rust"
[2025-01-22T21:05:58.530Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\cargo_expand\real.rs:65] Running cargo expand in '"\\\\?\\C:\\dev\\frb_int\\rust"'
[2025-01-22T21:05:58.531Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:129] execute command: bin=cargo args="expand --lib --theme=none --ugly" current_dir=Some("\\\\?\\C:\\dev\\frb_int\\rust") cmd="cargo" "expand" "--lib" "--theme=none" "--ugly"
[2025-01-22T21:05:59.020Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:140] command="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 {
    pub mod simple {
        use std::collections::HashSet;
        #[doc = "frb_encoded(235b6672622873796e63295d)"]
        pub fn test(vals: HashSet<u64>) -> String {
            ::alloc::__export::must_use({
                    let res = ::alloc::fmt::format(format_args!("{0:?}", vals));
                    res
                })
        }
        #[doc = "frb_encoded(235b66726228696e6974295d)"]
        pub fn init_app() { flutter_rust_bridge::setup_default_user_utils(); }
    }
}
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,
    clippy::clone_on_copy, clippy::let_unit_value, clippy::deref_addrof,
    clippy::explicit_auto_deref, clippy::borrow_deref_ref,
    clippy::needless_borrow)]
    use flutter_rust_bridge::for_generated::byteorder::{
        NativeEndian, ReadBytesExt, WriteBytesExt,
    };
    use flutter_rust_bridge::for_generated::{
        transform_result_dco, Lifetimeable, Lockable,
    };
    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) {
            let mut pool = T::get_pool().write().unwrap();
            let object = Self::decrement_strong_count_raw(raw, &mut pool);
            drop(pool);
            drop(object);
        }
        fn decrement_strong_count_raw(raw: usize,
            pool: &mut MoiArcPoolInner<T>) -> Option<MoiArcPoolValue<T>> {
            let value = pool.map.get_mut(&raw).unwrap();
            value.ref_count -= 1;
            if value.ref_count == 0 { pool.map.remove(&raw) } else { None }
        }
    }
    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;
    }
    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.add_raw(::flutter_rust_bridge::for_generated::Rust2DartAction::Success,
                value)
        }
        pub fn add_error<TR, T2>(&self, value: TR)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> where
            TR: ::flutter_rust_bridge::IntoIntoDart<T2>,
            T2: ::flutter_rust_bridge::IntoDart {
            self.add_raw(::flutter_rust_bridge::for_generated::Rust2DartAction::Error,
                value)
        }
        fn add_raw<TR,
            T2>(&self,
            action: ::flutter_rust_bridge::for_generated::Rust2DartAction,
            value: TR)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> where
            TR: ::flutter_rust_bridge::IntoIntoDart<T2>,
            T2: ::flutter_rust_bridge::IntoDart {
            self.base.add_raw(::flutter_rust_bridge::for_generated::DcoCodec::encode(action,
                    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.add_raw(::flutter_rust_bridge::for_generated::Rust2DartAction::Success,
                value)
        }
        pub fn add_error<TR: SseEncode>(&self, value: TR)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> {
            self.add_raw(::flutter_rust_bridge::for_generated::Rust2DartAction::Error,
                value)
        }
        pub fn add_raw<TR: SseEncode>(&self,
            action: ::flutter_rust_bridge::for_generated::Rust2DartAction,
            value: TR)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> {
            self.base.add_raw(::flutter_rust_bridge::for_generated::SseCodec::encode(action,
                    |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.7.0";
    pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 =
        -978319910;
    #[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__crate__api__simple__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 ||
                                            {
                                                let output_ok =
                                                    Result::<_, ()>::Ok({ crate::api::simple::init_app(); })?;
                                                Ok(output_ok)
                                            })())
                        }
                })
    }
    fn wire__crate__api__simple__test_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: "test",
                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_vals =
                        <std::collections::HashSet<u64>>::sse_decode(&mut deserializer);
                    deserializer.end();
                    transform_result_sse::<_,
                            ()>((move ||
                                    {
                                        let output_ok =
                                            Result::<_, ()>::Ok(crate::api::simple::test(api_vals))?;
                                        Ok(output_ok)
                                    })())
                })
    }
    impl SseDecode for std::collections::HashSet<u64> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner = <Vec<u64>>::sse_decode(deserializer);
            return inner.into_iter().collect();
        }
    }
    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 Vec<u64> {
        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(<u64>::sse_decode(deserializer));
            }
            return ans_;
        }
    }
    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 u64 {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_u64::<NativeEndian>().unwrap()
        }
    }
    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 i32 {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_i32::<NativeEndian>().unwrap()
        }
    }
    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 {
            1 =>
                wire__crate__api__simple__init_app_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 {
            2 =>
                wire__crate__api__simple__test_impl(ptr, rust_vec_len,
                    data_len),
            _ =>
                ::core::panicking::panic("internal error: entered unreachable code"),
        }
    }
    impl SseEncode for std::collections::HashSet<u64> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <Vec<u64>>::sse_encode(self.into_iter().collect(), 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 Vec<u64> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <i32>::sse_encode(self.len() as _, serializer);
            for item in self { <u64>::sse_encode(item, serializer); }
        }
    }
    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 u64 {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_u64::<NativeEndian>(self).unwrap();
        }
    }
    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 i32 {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_i32::<NativeEndian>(self).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"))]
    mod io {
        use super::*;
        use flutter_rust_bridge::for_generated::byteorder::{
            NativeEndian, ReadBytesExt, WriteBytesExt,
        };
        use flutter_rust_bridge::for_generated::{
            transform_result_dco, Lifetimeable, Lockable,
        };
        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 frb_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)
        }
    }
    #[cfg(not(target_family = "wasm"))]
    pub use io::*;
}
 stderr=    Checking rust_lib_frb_int v0.1.0 (C:\dev\frb_int\rust)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.26s


[2025-01-22T21:05:59.032Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\mod.rs:140] parse_function function name: "init_app"
[2025-01-22T21:05:59.032Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\lifetime.rs:36] parse_function_lifetime name=init_app inputs_lifetimes=[] output_lifetimes=[] ans=ParseFunctionLifetimeOutput { needs_extend_lifetime_per_arg: [] }
[2025-01-22T21:05:59.032Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\mod.rs:140] parse_function function name: "test"
[2025-01-22T21:05:59.033Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\lifetime.rs:36] parse_function_lifetime name=test inputs_lifetimes=[[]] output_lifetimes=[] ans=ParseFunctionLifetimeOutput { needs_extend_lifetime_per_arg: [false] }
[2025-01-22T21:05:59.033Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\ty\ty.rs:12] TypeParserWithContext.parse_type ty=u64 ans=Primitive(U64)
[2025-01-22T21:05:59.033Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\ty\ty.rs:12] TypeParserWithContext.parse_type ty=HashSet < u64 > ans=Delegate(Set(MirTypeDelegateSet { inner: Primitive(U64) }))
[2025-01-22T21:05:59.034Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\ty\ty.rs:12] TypeParserWithContext.parse_type ty=String ans=Delegate(String)
[2025-01-22T21:05:59.035Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\mod.rs:140] parse_function function name: "init_app"
[2025-01-22T21:05:59.035Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\lifetime.rs:36] parse_function_lifetime name=init_app inputs_lifetimes=[] output_lifetimes=[] ans=ParseFunctionLifetimeOutput { needs_extend_lifetime_per_arg: [] }
[2025-01-22T21:05:59.036Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\mod.rs:140] parse_function function name: "test"
[2025-01-22T21:05:59.036Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\function\real\lifetime.rs:36] parse_function_lifetime name=test inputs_lifetimes=[[]] output_lifetimes=[] ans=ParseFunctionLifetimeOutput { needs_extend_lifetime_per_arg: [false] }
[2025-01-22T21:05:59.036Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\ty\ty.rs:12] TypeParserWithContext.parse_type ty=u64 ans=Primitive(U64)
[2025-01-22T21:05:59.037Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\ty\ty.rs:12] TypeParserWithContext.parse_type ty=HashSet < u64 > ans=Delegate(Set(MirTypeDelegateSet { inner: Primitive(U64) }))
[2025-01-22T21:05:59.037Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\codegen\parser\mir\parser\ty\ty.rs:12] TypeParserWithContext.parse_type ty=String ans=Delegate(String)
[2025-01-22T21:05:59.042Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\cbindgen.rs:26] execute cbindgen rust_crate_dir="\\\\?\\C:\\dev\\frb_int\\rust" c_output_path="C:\\Users\\Dominic\\AppData\\Local\\Temp\\.tmpu1pytJ.h"
[2025-01-22T21:05:59.042Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\cbindgen.rs:46] cbindgen config: Config {
    header: None,
    includes: [],
    sys_includes: [
        "stdbool.h",
        "stdint.h",
        "stdlib.h",
    ],
    after_includes: Some(
        "// EXTRA BEGIN\ntypedef struct DartCObject *WireSyncRust2DartDco;\ntypedef struct WireSyncRust2DartSse {\n  uint8_t *ptr;\n  int32_t len;\n} WireSyncRust2DartSse;\n\ntypedef int64_t DartPort;\ntypedef bool (*DartPostCObjectFnType)(DartPort port_id, void *message);\nvoid store_dart_post_cobject(DartPostCObjectFnType ptr);\n// EXTRA END\ntypedef struct _Dart_Handle* Dart_Handle;",
    ),
    trailer: None,
    include_guard: None,
    pragma_once: false,
    no_includes: true,
    package_version: false,
    autogen_warning: None,
    include_version: false,
    namespace: None,
    namespaces: None,
    using_namespaces: None,
    braces: SameLine,
    line_length: 100,
    tab_width: 2,
    line_endings: LF,
    language: C,
    cpp_compat: false,
    style: Both,
    sort_by: None,
    usize_is_size_t: false,
    parse: ParseConfig {
        parse_deps: false,
        include: None,
        exclude: [],
        expand: ParseExpandConfig {
            crates: [],
            all_features: false,
            default_features: true,
            features: None,
            profile: Debug,
        },
        clean: false,
        extra_bindings: [],
    },
    export: ExportConfig {
        include: [
            "wire_cst_list_prim_u_64_strict",
            "wire_cst_list_prim_u_8_strict",
        ],
        exclude: [],
        rename: {},
        pre_body: {},
        body: {},
        prefix: None,
        item_types: [],
        renaming_overrides_prefixing: false,
        mangle: MangleConfig {
            rename_types: None,
            remove_underscores: false,
        },
    },
    macro_expansion: MacroExpansionConfig {
        bitflags: false,
    },
    layout: LayoutConfig {
        packed: None,
        aligned_n: None,
    },
    function: FunctionConfig {
        prefix: None,
        postfix: None,
        must_use: None,
        deprecated: None,
        deprecated_with_note: None,
        args: Auto,
        rename_args: None,
        swift_name_macro: None,
        sort_by: None,
        no_return: None,
    },
    structure: StructConfig {
        rename_fields: None,
        derive_constructor: false,
        derive_eq: false,
        derive_neq: false,
        derive_lt: false,
        derive_lte: false,
        derive_gt: false,
        derive_gte: false,
        derive_ostream: false,
        associated_constants_in_body: false,
        must_use: None,
        deprecated: None,
        deprecated_with_note: None,
    },
    enumeration: EnumConfig {
        rename_variants: None,
        rename_variant_name_fields: SnakeCase,
        add_sentinel: false,
        prefix_with_name: false,
        derive_helper_methods: false,
        derive_const_casts: false,
        derive_mut_casts: false,
        cast_assert_name: None,
        must_use: None,
        deprecated: None,
        deprecated_with_note: None,
        deprecated_variant: None,
        deprecated_variant_with_note: None,
        derive_tagged_enum_destructor: false,
        derive_tagged_enum_copy_constructor: false,
        derive_tagged_enum_copy_assignment: false,
        derive_ostream: false,
        enum_class: true,
        private_default_tagged_enum_constructor: false,
    },
    constant: ConstantConfig {
        allow_static_const: true,
        allow_constexpr: true,
        sort_by: None,
    },
    defines: {},
    documentation: true,
    documentation_style: Auto,
    documentation_length: Full,
    pointer: PtrConfig {
        non_null_attribute: None,
    },
    only_target_dependencies: false,
    cython: CythonConfig {
        header: None,
        cimports: {},
    },
    config_path: None,
}
[2025-01-22T21:05:59.043Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\cbindgen.rs:73] cbindgen parsed_crate_dir=C:\dev\frb_int\rust
[2025-01-22T21:05:59.272Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:151] Parsing crate rust_lib_frb_int
[2025-01-22T21:05:59.276Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:855] Skip rust_lib_frb_int::FLUTTER_RUST_BRIDGE_CODEGEN_VERSION - (not `pub`).
[2025-01-22T21:05:59.277Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:855] Skip rust_lib_frb_int::FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH - (not `pub`).
[2025-01-22T21:05:59.277Z INFO C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:739] Take rust_lib_frb_int::frbgen_frb_int_wire__crate__api__simple__init_app.
[2025-01-22T21:05:59.278Z INFO C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:739] Take rust_lib_frb_int::frbgen_frb_int_wire__crate__api__simple__test.
[2025-01-22T21:05:59.278Z INFO C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:739] Take rust_lib_frb_int::frbgen_frb_int_cst_new_list_prim_u_64_strict.
[2025-01-22T21:05:59.278Z INFO C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:739] Take rust_lib_frb_int::frbgen_frb_int_cst_new_list_prim_u_8_strict.
[2025-01-22T21:05:59.279Z INFO C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:921] Take rust_lib_frb_int::wire_cst_list_prim_u_64_strict.
[2025-01-22T21:05:59.279Z INFO C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\parser.rs:921] Take rust_lib_frb_int::wire_cst_list_prim_u_8_strict.
[2025-01-22T21:05:59.281Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\ty.rs:715] Can't find WireSyncRust2DartDco. This usually means that this type was incompatible or not found.
[2025-01-22T21:05:59.281Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\cfg.rs:230] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2025-01-22T21:05:59.282Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\cfg.rs:230] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2025-01-22T21:05:59.282Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\cfg.rs:230] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2025-01-22T21:05:59.283Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\cfg.rs:230] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2025-01-22T21:05:59.283Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\cfg.rs:230] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2025-01-22T21:05:59.284Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\cfg.rs:230] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2025-01-22T21:05:59.284Z WARN C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cbindgen-0.27.0\src\bindgen\ir\cfg.rs:230] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2025-01-22T21:05:59.288Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\ffigen.rs:57] execute ffigen c_path="C:\\Users\\Dominic\\AppData\\Local\\Temp\\.tmpQ6u88K.h" dart_path="C:\\Users\\Dominic\\AppData\\Local\\Temp\\.tmpQ6u88K.h" 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"]
[2025-01-22T21:05:59.289Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\ffigen.rs:77] ffigen_raw config="{\"output\":\"C:\\\\Users\\\\Dominic\\\\AppData\\\\Local\\\\Temp\\\\.tmpaxrO6f\",\"name\":\"RustLibWire\",\"description\":\"generated by flutter_rust_bridge\",\"headers\":{\"entry-points\":[\"C:\\\\Users\\\\Dominic\\\\AppData\\\\Local\\\\Temp\\\\.tmpQ6u88K.h\"],\"include-directives\":[\"C:\\\\Users\\\\Dominic\\\\AppData\\\\Local\\\\Temp\\\\.tmpQ6u88K.h\"]},\"comments\":false,\"preamble\":\"// ignore_for_file: camel_case_types, non_constant_identifier_names, avoid_positional_boolean_parameters, annotate_overrides, constant_identifier_names\",\"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\"],\"compiler-opts\":[],\"functions\":{\"rename\":{\"frbgen_frb_int_(.*)\":\"$1\"}},\"ignore-source-errors\":true}" config_file=NamedTempFile("C:\\Users\\Dominic\\AppData\\Local\\Temp\\.tmpljH2tt")
[2025-01-22T21:05:59.289Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\utils\dart_repository\dart_repo.rs:21] Guessing toolchain the runner is run into
[2025-01-22T21:05:59.290Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:129] execute command: bin=powershell args="-noprofile -command & \"flutter\" \"pub\" \"run\" \"ffigen\" \"--config\" \"C:\\\\Users\\\\Dominic\\\\AppData\\\\Local\\\\Temp\\\\.tmpljH2tt\"" current_dir=Some("\\\\?\\C:\\dev\\frb_int") cmd="powershell" "-noprofile" "-command" "& \"flutter\" \"pub\" \"run\" \"ffigen\" \"--config\" \"C:\\\\Users\\\\Dominic\\\\AppData\\\\Local\\\\Temp\\\\.tmpljH2tt\""
[2025-01-22T21:06:01.992Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:140] command="powershell" "-noprofile" "-command" "& \"flutter\" \"pub\" \"run\" \"ffigen\" \"--config\" \"C:\\\\Users\\\\Dominic\\\\AppData\\\\Local\\\\Temp\\\\.tmpljH2tt\"" stdout=[INFO]   : Running in Directory: 'C:\dev\frb_int'
[INFO]   : Input Headers: [file:///C:/Users/Dominic/AppData/Local/Temp/.tmpQ6u88K.h]
[WARNING]: No definition found for declaration -(Cursor) spelling: DartCObject, kind: 2, kindSpelling: StructDecl, type: 105, typeSpelling: struct DartCObject, usr: c:@S@DartCObject
[WARNING]: No definition found for declaration -(Cursor) spelling: DartCObject, kind: 2, kindSpelling: StructDecl, type: 105, typeSpelling: struct DartCObject, usr: c:@S@DartCObject
[WARNING]: No definition found for declaration -(Cursor) spelling: _Dart_Handle, kind: 2, kindSpelling: StructDecl, type: 105, typeSpelling: struct _Dart_Handle, usr: c:@S@_Dart_Handle
[WARNING]: No definition found for declaration -(Cursor) spelling: _Dart_Handle, kind: 2, kindSpelling: StructDecl, type: 105, typeSpelling: struct _Dart_Handle, usr: c:@S@_Dart_Handle
[WARNING]: Generated declaration '_Dart_Handle' starts with '_' and therefore will be private.
[INFO]   : Finished, Bindings generated in C:\Users\Dominic\AppData\Local\Temp\.tmpaxrO6f
 stderr=
[2025-01-22T21:06:02.002Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\dart_fix.rs:11] execute dart_fix base_path="\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust"
[2025-01-22T21:06:02.003Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:129] execute command: bin=powershell args="-noprofile -command & \"dart\" \"fix\" \"--apply\" \".\"" current_dir=Some("\\\\?\\C:\\dev\\frb_int\\lib\\src\\rust") cmd="powershell" "-noprofile" "-command" "& \"dart\" \"fix\" \"--apply\" \".\""
[2025-01-22T21:06:04.406Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:140] command="powershell" "-noprofile" "-command" "& \"dart\" \"fix\" \"--apply\" \".\"" stdout=Computing fixes in rust...
Nothing to fix!
 stderr=
[2025-01-22T21:06:04.407Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\dart_format.rs:24] execute dart_format paths=["lib\\src\\rust\\frb_generated.web.dart", "lib\\src\\rust\\api\\simple.dart", "lib\\src\\rust\\frb_generated.io.dart", "lib\\src\\rust\\frb_generated.dart"] line_length=80
[2025-01-22T21:06:04.409Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:129] execute command: bin=powershell args="-noprofile -command & \"dart\" \"format\" \"--line-length\" \"80\" \"lib\\\\src\\\\rust\\\\frb_generated.web.dart\" \"lib\\\\src\\\\rust\\\\api\\\\simple.dart\" \"lib\\\\src\\\\rust\\\\frb_generated.io.dart\" \"lib\\\\src\\\\rust\\\\frb_generated.dart\"" current_dir=Some("\\\\?\\C:\\dev\\frb_int") cmd="powershell" "-noprofile" "-command" "& \"dart\" \"format\" \"--line-length\" \"80\" \"lib\\\\src\\\\rust\\\\frb_generated.web.dart\" \"lib\\\\src\\\\rust\\\\api\\\\simple.dart\" \"lib\\\\src\\\\rust\\\\frb_generated.io.dart\" \"lib\\\\src\\\\rust\\\\frb_generated.dart\""
[2025-01-22T21:06:05.986Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:140] command="powershell" "-noprofile" "-command" "& \"dart\" \"format\" \"--line-length\" \"80\" \"lib\\\\src\\\\rust\\\\frb_generated.web.dart\" \"lib\\\\src\\\\rust\\\\api\\\\simple.dart\" \"lib\\\\src\\\\rust\\\\frb_generated.io.dart\" \"lib\\\\src\\\\rust\\\\frb_generated.dart\"" stdout=Formatted lib\\src\\rust\\frb_generated.web.dart
Formatted lib\\src\\rust\\api\\simple.dart
Formatted lib\\src\\rust\\frb_generated.io.dart
Formatted lib\\src\\rust\\frb_generated.dart
Formatted 4 files (4 changed) in 0.32 seconds.
 stderr=
[2025-01-22T21:06:05.987Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\format_rust.rs:9] execute format_rust paths=["src\\frb_generated.rs"]
[2025-01-22T21:06:05.988Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:129] execute command: bin=powershell args="-noprofile -command & \"rustfmt\" \"--edition\" \"2018\" \"src\\\\frb_generated.rs\"" current_dir=Some("\\\\?\\C:\\dev\\frb_int\\rust") cmd="powershell" "-noprofile" "-command" "& \"rustfmt\" \"--edition\" \"2018\" \"src\\\\frb_generated.rs\""
[2025-01-22T21:06:06.707Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\commands\command_runner.rs:140] command="powershell" "-noprofile" "-command" "& \"rustfmt\" \"--edition\" \"2018\" \"src\\\\frb_generated.rs\"" stdout= stderr=
[2025-01-22T21:06:06.710Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\utils\dart_repository\dart_repo.rs:21] Guessing toolchain the runner is run into
[2025-01-22T21:06:06.711Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\utils\dart_repository\dart_repo.rs:68] Checking presence of flutter_rust_bridge in dependencies at "\\\\?\\C:\\dev\\frb_int"
[2025-01-22T21:06:06.712Z DEBUG C:\Users\Dominic\.cargo\registry\src\index.crates.io-6f17d22bba15001f\flutter_rust_bridge_codegen-2.7.0\src\library\utils\dart_repository\dart_repo.rs:93] Checking presence of flutter_rust_bridge in dependencies at "\\\\?\\C:\\dev\\frb_int"
Done!

OS

Windows 10

Version of flutter_rust_bridge_codegen

2.7.0

Flutter info

[√] Flutter (Channel stable, 3.27.0, on Microsoft Windows [Version 10.0.19045.5371], locale en-US)
    • Flutter version 3.27.0 on channel stable at C:\SDKs\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 8495dee1fd (6 weeks ago), 2024-12-10 14:23:39 -0800
    • Engine revision 83bacfc525
    • Dart version 3.6.0
    • DevTools version 2.40.2

[√] Windows Version (Installed version of Windows is version 10 or higher)

[√] Android toolchain - develop for Android devices (Android SDK version 36.0.0-rc1)
    • Android SDK at C:\Users\Dominic\AppData\Local\Android\sdk
    • Platform android-35, build-tools 36.0.0-rc1
    • Java binary at: C:\Program Files\Android\Android Studio1\jbr\bin\java
    • Java version OpenJDK Runtime Environment (build 21.0.3+-12282718-b509.11)     
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop Windows apps (Visual Studio Community 2022 17.3.4)      
    • Visual Studio at C:\Program Files\Microsoft Visual Studio\2022\Community      
    • Visual Studio Community 2022 version 17.3.32901.215
    • Windows 10 SDK version 10.0.19041.0

[√] Android Studio (version 2024.2)
    • Android Studio at C:\Program Files\Android\Android Studio1
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 21.0.3+-12282718-b509.11)     

[√] VS Code (version 1.96.2)
    • VS Code at C:\Users\Dominic\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.102.0

[√] Connected device (4 available)
    • Pixel 7 (mobile)  • 2A271FDH200DGG • android-arm64  • Android 15 (API 35)
    • Windows (desktop) • windows        • windows-x64    • Microsoft Windows [Version 10.0.19045.5371]
    • Chrome (web)      • chrome         • web-javascript • Google Chrome 131.0.6778.265
    • Edge (web)        • edge           • web-javascript • Microsoft Edge 131.0.2903.146

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

• No issues found!
@domph domph added the bug Something isn't working label Jan 22, 2025
Copy link

welcome bot commented Jan 22, 2025

Hi! Thanks for opening your first issue here! 😄

@domph
Copy link
Author

domph commented Jan 22, 2025

From a cursory glance, it seems likeUint64List inside generalized_typed_data/_io.dart needs to be modified to accept construction from a List<BigInt>? Not sure if larger changes are required though.

@fzyzcjy
Copy link
Owner

fzyzcjy commented Jan 22, 2025

Yes, looks like a bug (probably because how u64 is handled especially on the web...), and will be fixed in the next batch. Btw, try type_64bit_int: true to see whether it workarounds.

@fzyzcjy fzyzcjy added the awaiting Waiting for responses, PR, further discussions, upstream release, etc label Jan 22, 2025
@domph
Copy link
Author

domph commented Jan 22, 2025

Yeah, it works with type_64bit_int: true (so long as full_dep is not enabled), though of course a little unideal since it doesn't capture the full range of values for a u64. If full_dep is enabled, though, an error occurs in the frb_generated.io.dart file:

Error:

lib/src/rust/frb_generated.io.dart:131:7: Error: The method 'cst_api_fill_to_wire_CastedPrimitive_u_64' isn't defined for the class 'RustLibApiImplPlatform'.
 - 'RustLibApiImplPlatform' is from 'package:frb_int/src/rust/frb_generated.io.dart' ('lib/src/rust/frb_generated.io.dart').
Try correcting the name to the name of an existing method, or defining a method named 'cst_api_fill_to_wire_CastedPrimitive_u_64'.
      cst_api_fill_to_wire_CastedPrimitive_u_64(raw[i], ans.ref.ptr[i]);
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Code snippet inside frb_generated.io.dart:

  @protected
  ffi.Pointer<wire_cst_list_CastedPrimitive_u_64>
      cst_encode_list_CastedPrimitive_u_64(List<int> raw) {
    // Codec=Cst (C-struct based), see doc to use other codecs
    final ans = wire.cst_new_list_CastedPrimitive_u_64(raw.length);
    for (var i = 0; i < raw.length; ++i) {
      cst_api_fill_to_wire_CastedPrimitive_u_64(raw[i], ans.ref.ptr[i]);
    }
    return ans;
  }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
awaiting Waiting for responses, PR, further discussions, upstream release, etc bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants