fzyzcjy / flutter_rust_bridge

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

[Bug] Unable to generate dart bindings with enums variants that contain other types #813

Closed justinmoon closed 1 year ago

justinmoon commented 1 year ago

Describe the bug

I have a flutter app where the actual app is in apps/<app-name>, which contains a package that uses flutter_rust_bridge in packages/api_client/lib/src/rust_bridge.

I have the following enum in api.rs:

pub enum Foo {
    bar(u64),
}

pub fn get_foo() -> Foo {
    Foo::bar(10)
}

From the rust_bridge folder, I attempt to generate bindings with the following command:

$ flutter_rust_bridge_codegen \
        -r src/api.rs \
        -d bridge_generated.dart \
        -c ../../../../../apps/something/ios/Runner/bridge_generated.h
...
Unhandled exception:
Bad state: Unable to generate package graph, no `/Users/justin/something/mobile/packages/api_client/.dart_tool/flutter_gen/pubspec.yaml` found.
#0      _pubspecForPath (package:build_runner_core/src/package_graph/package_graph.dart:232:5)
#1      _parsePackageDependencies (package:build_runner_core/src/package_graph/package_graph.dart:206:21)
#2      PackageGraph.forPath (package:build_runner_core/src/package_graph/package_graph.dart:101:33)
<asynchronous suspension>
#3      main (file:///Users/justin/bin/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.3.2/bin/build_runner.dart:27:30)
<asynchronous suspension>

If the enum isn't nested at all this doesn't happen. For example, the following works just fine:

pub enum Foo {
    bar
}

Codegen logs with RUST_LOG=debug environment variable

% RUST_LOG=debug just    
flutter_rust_bridge_codegen -r src/api.rs -d bridge_generated.dart -c ../../../../../apps/something/ios/Runner/bridge_generated.h
[2022-11-01T10:09:40Z DEBUG flutter_rust_bridge_codegen] configs=[Opts { rust_input_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/api.rs", dart_output_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/bridge_generated.dart", dart_decl_output_path: None, c_output_path: ["/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/../../../../../apps/something/ios/Runner/bridge_generated.h"], rust_crate_dir: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge", rust_output_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs", class_name: "RustBridge", dart_format_line_length: 80, skip_add_mod_to_lib: false, 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: "", manifest_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/Cargo.toml", dart_root: Some("/Users/justin/something/mobile/packages/api_client"), build_runner: true, block_index: BlockIndex(0), skip_deps_check: false, wasm_enabled: false, inline_rust: false }]
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/api.rs"
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge.rs"
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs"
[2022-11-01T10:09:40Z WARN  lib_flutter_rust_bridge_codegen::source_graph] Skipping unresolvable module io (tried /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io/mod.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io/mod.rs, )
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/payment.rs"
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(stream)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(init)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(join_federation)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(reset)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(balance)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(list_federations)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(pay_invoice)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(generate_invoice)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(spend_ecash)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(receive_ecash)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(get_payment)
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::tools] Guessing toolchain the runner is run into
[2022-11-01T10:09:40Z DEBUG lib_flutter_rust_bridge_codegen::commands] execute command: bin=sh args="-c \"flutter\" \"--version\"" current_dir=None cmd="sh" "-c" "\"flutter\" \"--version\""
Flutter 3.3.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 6928314d50 (7 days ago) • 2022-10-25 16:34:41 -0400
Engine • revision 3ad69d7be3
Tools • Dart 2.18.2 • DevTools 2.15.0
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] command="sh" "-c" "\"flutter\" \"--version\"" stdout= stderr=
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::tools] Checking presence of ffi in dependencies at /Users/justin/something/mobile/packages/api_client
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::tools] Checking presence of ffi in dependencies at /Users/justin/something/mobile/packages/api_client
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::tools] Checking presence of ffigen in dev_dependencies at /Users/justin/something/mobile/packages/api_client
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::tools] Checking presence of ffigen in dev_dependencies at /Users/justin/something/mobile/packages/api_client
[2022-11-01T10:09:41Z INFO  lib_flutter_rust_bridge_codegen] Picked config: Opts { rust_input_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/api.rs", dart_output_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/bridge_generated.dart", dart_decl_output_path: None, c_output_path: ["/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/../../../../../apps/something/ios/Runner/bridge_generated.h"], rust_crate_dir: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge", rust_output_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs", class_name: "RustBridge", dart_format_line_length: 80, skip_add_mod_to_lib: false, 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: "", manifest_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/Cargo.toml", dart_root: Some("/Users/justin/something/mobile/packages/api_client"), build_runner: true, block_index: BlockIndex(0), skip_deps_check: false, wasm_enabled: false, inline_rust: false }
[2022-11-01T10:09:41Z INFO  lib_flutter_rust_bridge_codegen] Phase: Parse source code to AST, then to IR
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/api.rs"
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge.rs"
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs"
[2022-11-01T10:09:41Z WARN  lib_flutter_rust_bridge_codegen::source_graph] Skipping unresolvable module io (tried /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io/mod.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io/mod.rs, )
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::source_graph] Trying to parse "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/payment.rs"
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(stream)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(init)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(join_federation)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(reset)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(balance)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(list_federations)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(pay_invoice)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(generate_invoice)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(spend_ecash)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(receive_ecash)
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::parser] parse_function function name: Ident(get_payment)
[2022-11-01T10:09:41Z INFO  lib_flutter_rust_bridge_codegen] Phase: Transform IR
[2022-11-01T10:09:41Z INFO  lib_flutter_rust_bridge_codegen] Phase: Generate Rust code
[2022-11-01T10:09:41Z INFO  lib_flutter_rust_bridge_codegen] Phase: Generate Dart code
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::generator::dart] distinct_input_types=[Delegate(String), Primitive(U8), PrimitiveList(IrTypePrimitiveList { primitive: U8 })]
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::generator::dart] distinct_output_types=[Delegate(String), Delegate(StringList), Boxed(IrTypeBoxed { exist_in_real_api: false, inner: StructRef(IrTypeStructRef { name: "EcashPayment", freezed: false }) }), StructRef(IrTypeStructRef { name: "EcashPayment", freezed: false }), Primitive(I32), EnumRef(IrTypeEnumRef { name: "Payment" }), Delegate(PrimitiveEnum { ir: IrTypeEnumRef { name: "PaymentDirection" }, repr: I32 }), Delegate(PrimitiveEnum { ir: IrTypeEnumRef { name: "PaymentStatus" }, repr: I32 }), Primitive(U64), Primitive(U8), PrimitiveList(IrTypePrimitiveList { primitive: U8 }), Primitive(Unit)]
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] execute format_rust path=["/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs"]
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] execute command: bin=rustfmt args="/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs" current_dir=None cmd="rustfmt" "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs"
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] command="rustfmt" "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs" stdout= stderr=
[2022-11-01T10:09:41Z INFO  lib_flutter_rust_bridge_codegen] Phase: Generating Dart bindings for Rust
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] execute cbindgen rust_crate_dir=/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge c_output_path=/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpCnUAYV.h
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] cbindgen config: Config {
        header: None,
        includes: [],
        sys_includes: [
            "stdbool.h",
            "stdint.h",
            "stdlib.h",
        ],
        after_includes: None,
        trailer: None,
        include_guard: None,
        pragma_once: false,
        no_includes: true,
        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_EcashPayment\"",
            ],
            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,
            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,
        },
        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,
            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: {},
        },
    }
[2022-11-01T10:09:41Z DEBUG cbindgen::bindgen::parser] Parsing crate rust_bridge
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::Foo - opaque (Enum is not marked with a valid #[repr(prim)] or #[repr(C)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::FederationId.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::BridgeEvent - opaque (Enum is not marked with a valid #[repr(prim)] or #[repr(C)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::BridgeFederation - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::Bridge - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::Federation - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::DartPort.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::DartPostCObjectFnType.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::store_dart_post_cobject.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::WireSyncReturnStruct.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_stream.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_init.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_join_federation.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_reset.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_balance.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_list_federations.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_pay_invoice.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_generate_invoice.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_spend_ecash.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_receive_ecash.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_get_payment.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::new_uint_8_list_0.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::wire_uint_8_list.
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::free_WireSyncReturnStruct.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::parser] Skip rust_bridge::DB_PREFIX_PAYMENTS - (not `pub`).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::LightningPayment - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::EcashPayment - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::BitcoinPayment - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::PaymentStatus - opaque (Enum is not marked with a valid #[repr(prim)] or #[repr(C)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::PaymentDirection - opaque (Enum is not marked with a valid #[repr(prim)] or #[repr(C)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::PaymentKey - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::PaymentKeyPrefix - opaque (Struct is not marked #[repr(C)] or #[repr(transparent)].).
[2022-11-01T10:09:41Z INFO  cbindgen::bindgen::parser] Take rust_bridge::Payment - opaque (Enum is not marked with a valid #[repr(prim)] or #[repr(C)].).
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::parser] Skip rust_bridge::DB_PREFIX - (not `pub`).
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::parser] Skip rust_bridge::DB_PREFIX - (not `pub`).
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z WARN  cbindgen::bindgen::ir::cfg] Missing `[defines]` entry for `target_family = "wasm"` in cbindgen config.
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] execute ffigen c_path=/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpCnUAYV.h dart_path=/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpcfTbW8 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"]
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] ffigen config: 
            output: '/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpcfTbW8'
            name: 'RustBridgeWire'
            description: 'generated by flutter_rust_bridge'
            headers:
              entry-points:
                - '/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpCnUAYV.h'
              include-directives:
                - '/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpCnUAYV.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'

[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] ffigen config_file: NamedTempFile("/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpddumFo")
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::tools] Guessing toolchain the runner is run into
[2022-11-01T10:09:41Z DEBUG lib_flutter_rust_bridge_codegen::commands] execute command: bin=sh args="-c \"flutter\" \"pub\" \"run\" \"ffigen\" \"--config\" \"/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpddumFo\"" current_dir=Some("/Users/justin/something/mobile/packages/api_client") cmd="sh" "-c" "\"flutter\" \"pub\" \"run\" \"ffigen\" \"--config\" \"/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpddumFo\""
Running in Directory: '/Users/justin/something/mobile/packages/api_client'
Input Headers: [/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpCnUAYV.h]
Finished, Bindings generated in /var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpcfTbW8
[2022-11-01T10:09:42Z DEBUG lib_flutter_rust_bridge_codegen::commands] command="sh" "-c" "\"flutter\" \"pub\" \"run\" \"ffigen\" \"--config\" \"/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpddumFo\"" stdout= stderr=
[2022-11-01T10:09:42Z INFO  lib_flutter_rust_bridge_codegen] Phase: Running build_runner
[2022-11-01T10:09:42Z INFO  lib_flutter_rust_bridge_codegen::commands] Running build_runner at /Users/justin/something/mobile/packages/api_client
[2022-11-01T10:09:42Z DEBUG lib_flutter_rust_bridge_codegen::tools] Guessing toolchain the runner is run into
[2022-11-01T10:09:42Z DEBUG lib_flutter_rust_bridge_codegen::commands] execute command: bin=sh args="-c \"flutter\" \"pub\" \"run\" \"build_runner\" \"build\" \"--delete-conflicting-outputs\"" current_dir=Some("/Users/justin/something/mobile/packages/api_client") cmd="sh" "-c" "\"flutter\" \"pub\" \"run\" \"build_runner\" \"build\" \"--delete-conflicting-outputs\""
Unhandled exception:
Bad state: Unable to generate package graph, no `/Users/justin/something/mobile/packages/api_client/.dart_tool/flutter_gen/pubspec.yaml` found.
#0      _pubspecForPath (package:build_runner_core/src/package_graph/package_graph.dart:232:5)
#1      _parsePackageDependencies (package:build_runner_core/src/package_graph/package_graph.dart:206:21)
#2      PackageGraph.forPath (package:build_runner_core/src/package_graph/package_graph.dart:101:33)
<asynchronous suspension>
#3      main (file:///Users/justin/bin/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.3.2/bin/build_runner.dart:27:30)
<asynchronous suspension>
pub finished with exit code 255
[2022-11-01T10:09:43Z WARN  lib_flutter_rust_bridge_codegen::commands] command="sh" "-c" "\"flutter\" \"pub\" \"run\" \"build_runner\" \"build\" \"--delete-conflicting-outputs\"" stdout= stderr=
[2022-11-01T10:09:43Z ERROR flutter_rust_bridge_codegen] fatal: Failed to run build_runner for /Users/justin/something/mobile/packages/api_client: 
error: Recipe `gen` failed on line 7 with exit code 1

To Reproduce

No response

Expected behavior

No response

Generated binding code

`bridge_generated.h`:

#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

typedef int64_t DartPort;

typedef bool (*DartPostCObjectFnType)(DartPort port_id, void *message);

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

typedef struct WireSyncReturnStruct {
  uint8_t *ptr;
  int32_t len;
  bool success;
} WireSyncReturnStruct;

void store_dart_post_cobject(DartPostCObjectFnType ptr);

void wire_stream(int64_t port_);

void wire_init(int64_t port_, struct wire_uint_8_list *data_dir);

void wire_join_federation(int64_t port_, struct wire_uint_8_list *connect_string);

void wire_reset(int64_t port_);

void wire_balance(int64_t port_, struct wire_uint_8_list *federation_id);

void wire_list_federations(int64_t port_);

void wire_pay_invoice(int64_t port_,
                      struct wire_uint_8_list *federation_id,
                      struct wire_uint_8_list *invoice);

void wire_generate_invoice(int64_t port_,
                           struct wire_uint_8_list *federation_id,
                           struct wire_uint_8_list *amount);

void wire_spend_ecash(int64_t port_,
                      struct wire_uint_8_list *federation_id,
                      struct wire_uint_8_list *amount);

void wire_receive_ecash(int64_t port_,
                        struct wire_uint_8_list *federation_id,
                        struct wire_uint_8_list *ecash);

void wire_get_foo(int64_t port_);

struct wire_uint_8_list *new_uint_8_list_0(int32_t len);

void free_WireSyncReturnStruct(struct WireSyncReturnStruct val);

static int64_t dummy_method_to_enforce_bundling(void) {
    int64_t dummy_var = 0;
    dummy_var ^= ((int64_t) (void*) wire_stream);
    dummy_var ^= ((int64_t) (void*) wire_init);
    dummy_var ^= ((int64_t) (void*) wire_join_federation);
    dummy_var ^= ((int64_t) (void*) wire_reset);
    dummy_var ^= ((int64_t) (void*) wire_balance);
    dummy_var ^= ((int64_t) (void*) wire_list_federations);
    dummy_var ^= ((int64_t) (void*) wire_pay_invoice);
    dummy_var ^= ((int64_t) (void*) wire_generate_invoice);
    dummy_var ^= ((int64_t) (void*) wire_spend_ecash);
    dummy_var ^= ((int64_t) (void*) wire_receive_ecash);
    dummy_var ^= ((int64_t) (void*) wire_get_foo);
    dummy_var ^= ((int64_t) (void*) new_uint_8_list_0);
    dummy_var ^= ((int64_t) (void*) free_WireSyncReturnStruct);
    dummy_var ^= ((int64_t) (void*) store_dart_post_cobject);
    return dummy_var;
}

bridge_generated.dart:

// AUTO GENERATED FILE, DO NOT EDIT.
// Generated by `flutter_rust_bridge`@ 1.49.0.
            // ignore_for_file: non_constant_identifier_names, unused_element, duplicate_ignore, directives_ordering, curly_braces_in_flow_control_structures, unnecessary_lambdas, slash_for_doc_comments, prefer_const_literals_to_create_immutables, implicit_dynamic_list_literal, duplicate_import, unused_import, prefer_single_quotes, prefer_const_constructors, use_super_parameters, always_use_package_imports, annotate_overrides, invalid_use_of_protected_member, constant_identifier_names

import 'dart:convert';
            import 'dart:async';
            import 'package:flutter_rust_bridge/flutter_rust_bridge.dart';
import 'package:freezed_annotation/freezed_annotation.dart' hide protected;

        import 'package:meta/meta.dart';
 import 'package:meta/meta.dart';
import 'dart:ffi' as ffi;

part 'bridge_generated.freezed.dart';

abstract class RustBridge {
            Stream<String> stream({ dynamic hint });

FlutterRustBridgeTaskConstMeta get kStreamConstMeta;

Future<void> init({ required String dataDir,dynamic hint });

FlutterRustBridgeTaskConstMeta get kInitConstMeta;

Future<void> joinFederation({ required String connectString,dynamic hint });

FlutterRustBridgeTaskConstMeta get kJoinFederationConstMeta;

Future<void> reset({ dynamic hint });

FlutterRustBridgeTaskConstMeta get kResetConstMeta;

Future<int> balance({ required String federationId,dynamic hint });

FlutterRustBridgeTaskConstMeta get kBalanceConstMeta;

Future<List<String>> listFederations({ dynamic hint });

FlutterRustBridgeTaskConstMeta get kListFederationsConstMeta;

Future<void> payInvoice({ required String federationId,required String invoice,dynamic hint });

FlutterRustBridgeTaskConstMeta get kPayInvoiceConstMeta;

Future<String> generateInvoice({ required String federationId,required String amount,dynamic hint });

FlutterRustBridgeTaskConstMeta get kGenerateInvoiceConstMeta;

Future<String> spendEcash({ required String federationId,required String amount,dynamic hint });

FlutterRustBridgeTaskConstMeta get kSpendEcashConstMeta;

Future<void> receiveEcash({ required String federationId,required String ecash,dynamic hint });

FlutterRustBridgeTaskConstMeta get kReceiveEcashConstMeta;

Future<Foo> getFoo({ dynamic hint });

FlutterRustBridgeTaskConstMeta get kGetFooConstMeta;
        }

@freezed
                class Foo with _$Foo {
                    const factory Foo.bar(int field0,) = Foo_bar;
                }

class RustBridgeImpl implements RustBridge {
                final RustBridgePlatform _platform;
                factory RustBridgeImpl(ExternalLibrary dylib) => RustBridgeImpl.raw(RustBridgePlatform(dylib));

                /// Only valid on web/WASM platforms.
                factory RustBridgeImpl.wasm(FutureOr<WasmModule> module) =>
                    RustBridgeImpl(module as ExternalLibrary);
                RustBridgeImpl.raw(this._platform);
Stream<String> stream({ dynamic hint }) => _platform.executeStream(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_stream(port_),
            parseSuccessData: _wire2api_String,

        constMeta: kStreamConstMeta,
        argValues: [],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kStreamConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "stream",
            argNames: [],
        );

Future<void> init({ required String dataDir,dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_init(port_, _platform.api2wire_String(dataDir)),
            parseSuccessData: _wire2api_unit,

        constMeta: kInitConstMeta,
        argValues: [dataDir],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kInitConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "init",
            argNames: ["dataDir"],
        );

Future<void> joinFederation({ required String connectString,dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_join_federation(port_, _platform.api2wire_String(connectString)),
            parseSuccessData: _wire2api_unit,

        constMeta: kJoinFederationConstMeta,
        argValues: [connectString],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kJoinFederationConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "join_federation",
            argNames: ["connectString"],
        );

Future<void> reset({ dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_reset(port_),
            parseSuccessData: _wire2api_unit,

        constMeta: kResetConstMeta,
        argValues: [],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kResetConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "reset",
            argNames: [],
        );

Future<int> balance({ required String federationId,dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_balance(port_, _platform.api2wire_String(federationId)),
            parseSuccessData: _wire2api_u64,

        constMeta: kBalanceConstMeta,
        argValues: [federationId],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kBalanceConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "balance",
            argNames: ["federationId"],
        );

Future<List<String>> listFederations({ dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_list_federations(port_),
            parseSuccessData: _wire2api_StringList,

        constMeta: kListFederationsConstMeta,
        argValues: [],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kListFederationsConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "list_federations",
            argNames: [],
        );

Future<void> payInvoice({ required String federationId,required String invoice,dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_pay_invoice(port_, _platform.api2wire_String(federationId), _platform.api2wire_String(invoice)),
            parseSuccessData: _wire2api_unit,

        constMeta: kPayInvoiceConstMeta,
        argValues: [federationId, invoice],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kPayInvoiceConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "pay_invoice",
            argNames: ["federationId", "invoice"],
        );

Future<String> generateInvoice({ required String federationId,required String amount,dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_generate_invoice(port_, _platform.api2wire_String(federationId), _platform.api2wire_String(amount)),
            parseSuccessData: _wire2api_String,

        constMeta: kGenerateInvoiceConstMeta,
        argValues: [federationId, amount],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kGenerateInvoiceConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "generate_invoice",
            argNames: ["federationId", "amount"],
        );

Future<String> spendEcash({ required String federationId,required String amount,dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_spend_ecash(port_, _platform.api2wire_String(federationId), _platform.api2wire_String(amount)),
            parseSuccessData: _wire2api_String,

        constMeta: kSpendEcashConstMeta,
        argValues: [federationId, amount],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kSpendEcashConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "spend_ecash",
            argNames: ["federationId", "amount"],
        );

Future<void> receiveEcash({ required String federationId,required String ecash,dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_receive_ecash(port_, _platform.api2wire_String(federationId), _platform.api2wire_String(ecash)),
            parseSuccessData: _wire2api_unit,

        constMeta: kReceiveEcashConstMeta,
        argValues: [federationId, ecash],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kReceiveEcashConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "receive_ecash",
            argNames: ["federationId", "ecash"],
        );

Future<Foo> getFoo({ dynamic hint }) => _platform.executeNormal(FlutterRustBridgeTask(
            callFfi: (port_) => _platform.inner.wire_get_foo(port_),
            parseSuccessData: _wire2api_foo,

        constMeta: kGetFooConstMeta,
        argValues: [],
        hint: hint,

        ));

        FlutterRustBridgeTaskConstMeta get kGetFooConstMeta => const FlutterRustBridgeTaskConstMeta(
            debugName: "get_foo",
            argNames: [],
        );

// Section: wire2api

String _wire2api_String(dynamic raw) {
            return raw as String;
        }

List<String> _wire2api_StringList(dynamic raw) {
            return (raw as List<dynamic>).cast<String>();
        }

Foo _wire2api_foo(dynamic raw) {
            switch (raw[0]) {
                case 0: return Foo_bar(_wire2api_u64(raw[1]),);
                default: throw Exception("unreachable");
            }
        }

int _wire2api_u64(dynamic raw) {
            return castInt(raw);
        }

int _wire2api_u8(dynamic raw) {
            return raw as int;
        }

Uint8List _wire2api_uint_8_list(dynamic raw) {
            return raw as Uint8List;
        }

void _wire2api_unit(dynamic raw) {
            return;
        }

}

// Section: api2wire

@protected
                    int api2wire_u8(int raw) {
                        return raw;
                    }

class RustBridgePlatform extends FlutterRustBridgeBase<RustBridgeWire> {
                RustBridgePlatform(ffi.DynamicLibrary dylib) : super(RustBridgeWire(dylib));
// Section: api2wire

@protected
                    ffi.Pointer<wire_uint_8_list> api2wire_String(String raw) {
                        return api2wire_uint_8_list(utf8.encoder.convert(raw));
                    }

@protected
                    ffi.Pointer<wire_uint_8_list> api2wire_uint_8_list(Uint8List raw) {
                        final ans = inner.new_uint_8_list_0(raw.length);
                    ans.ref.ptr.asTypedList(raw.length).setAll(0, raw);
                    return ans;
                    }
// Section: api_fill_to_wire

}

// ignore_for_file: camel_case_types, non_constant_identifier_names, avoid_positional_boolean_parameters, annotate_overrides, constant_identifier_names

// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.

/// generated by flutter_rust_bridge
class RustBridgeWire implements FlutterRustBridgeWireBase {
  /// Holds the symbol lookup function.
  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
      _lookup;

  /// The symbols are looked up in [dynamicLibrary].
  RustBridgeWire(ffi.DynamicLibrary dynamicLibrary)
      : _lookup = dynamicLibrary.lookup;

  /// The symbols are looked up with [lookup].
  RustBridgeWire.fromLookup(
      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
          lookup)
      : _lookup = lookup;

  void store_dart_post_cobject(
    DartPostCObjectFnType ptr,
  ) {
    return _store_dart_post_cobject(
      ptr,
    );
  }

  late final _store_dart_post_cobjectPtr =
      _lookup<ffi.NativeFunction<ffi.Void Function(DartPostCObjectFnType)>>(
          'store_dart_post_cobject');
  late final _store_dart_post_cobject = _store_dart_post_cobjectPtr
      .asFunction<void Function(DartPostCObjectFnType)>();

  void wire_stream(
    int port_,
  ) {
    return _wire_stream(
      port_,
    );
  }

  late final _wire_streamPtr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>('wire_stream');
  late final _wire_stream = _wire_streamPtr.asFunction<void Function(int)>();

  void wire_init(
    int port_,
    ffi.Pointer<wire_uint_8_list> data_dir,
  ) {
    return _wire_init(
      port_,
      data_dir,
    );
  }

  late final _wire_initPtr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Int64, ffi.Pointer<wire_uint_8_list>)>>('wire_init');
  late final _wire_init = _wire_initPtr
      .asFunction<void Function(int, ffi.Pointer<wire_uint_8_list>)>();

  void wire_join_federation(
    int port_,
    ffi.Pointer<wire_uint_8_list> connect_string,
  ) {
    return _wire_join_federation(
      port_,
      connect_string,
    );
  }

  late final _wire_join_federationPtr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Int64,
              ffi.Pointer<wire_uint_8_list>)>>('wire_join_federation');
  late final _wire_join_federation = _wire_join_federationPtr
      .asFunction<void Function(int, ffi.Pointer<wire_uint_8_list>)>();

  void wire_reset(
    int port_,
  ) {
    return _wire_reset(
      port_,
    );
  }

  late final _wire_resetPtr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>('wire_reset');
  late final _wire_reset = _wire_resetPtr.asFunction<void Function(int)>();

  void wire_balance(
    int port_,
    ffi.Pointer<wire_uint_8_list> federation_id,
  ) {
    return _wire_balance(
      port_,
      federation_id,
    );
  }

  late final _wire_balancePtr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Int64, ffi.Pointer<wire_uint_8_list>)>>('wire_balance');
  late final _wire_balance = _wire_balancePtr
      .asFunction<void Function(int, ffi.Pointer<wire_uint_8_list>)>();

  void wire_list_federations(
    int port_,
  ) {
    return _wire_list_federations(
      port_,
    );
  }

  late final _wire_list_federationsPtr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>(
          'wire_list_federations');
  late final _wire_list_federations =
      _wire_list_federationsPtr.asFunction<void Function(int)>();

  void wire_pay_invoice(
    int port_,
    ffi.Pointer<wire_uint_8_list> federation_id,
    ffi.Pointer<wire_uint_8_list> invoice,
  ) {
    return _wire_pay_invoice(
      port_,
      federation_id,
      invoice,
    );
  }

  late final _wire_pay_invoicePtr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Int64, ffi.Pointer<wire_uint_8_list>,
              ffi.Pointer<wire_uint_8_list>)>>('wire_pay_invoice');
  late final _wire_pay_invoice = _wire_pay_invoicePtr.asFunction<
      void Function(
          int, ffi.Pointer<wire_uint_8_list>, ffi.Pointer<wire_uint_8_list>)>();

  void wire_generate_invoice(
    int port_,
    ffi.Pointer<wire_uint_8_list> federation_id,
    ffi.Pointer<wire_uint_8_list> amount,
  ) {
    return _wire_generate_invoice(
      port_,
      federation_id,
      amount,
    );
  }

  late final _wire_generate_invoicePtr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Int64, ffi.Pointer<wire_uint_8_list>,
              ffi.Pointer<wire_uint_8_list>)>>('wire_generate_invoice');
  late final _wire_generate_invoice = _wire_generate_invoicePtr.asFunction<
      void Function(
          int, ffi.Pointer<wire_uint_8_list>, ffi.Pointer<wire_uint_8_list>)>();

  void wire_spend_ecash(
    int port_,
    ffi.Pointer<wire_uint_8_list> federation_id,
    ffi.Pointer<wire_uint_8_list> amount,
  ) {
    return _wire_spend_ecash(
      port_,
      federation_id,
      amount,
    );
  }

  late final _wire_spend_ecashPtr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Int64, ffi.Pointer<wire_uint_8_list>,
              ffi.Pointer<wire_uint_8_list>)>>('wire_spend_ecash');
  late final _wire_spend_ecash = _wire_spend_ecashPtr.asFunction<
      void Function(
          int, ffi.Pointer<wire_uint_8_list>, ffi.Pointer<wire_uint_8_list>)>();

  void wire_receive_ecash(
    int port_,
    ffi.Pointer<wire_uint_8_list> federation_id,
    ffi.Pointer<wire_uint_8_list> ecash,
  ) {
    return _wire_receive_ecash(
      port_,
      federation_id,
      ecash,
    );
  }

  late final _wire_receive_ecashPtr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Int64, ffi.Pointer<wire_uint_8_list>,
              ffi.Pointer<wire_uint_8_list>)>>('wire_receive_ecash');
  late final _wire_receive_ecash = _wire_receive_ecashPtr.asFunction<
      void Function(
          int, ffi.Pointer<wire_uint_8_list>, ffi.Pointer<wire_uint_8_list>)>();

  void wire_get_foo(
    int port_,
  ) {
    return _wire_get_foo(
      port_,
    );
  }

  late final _wire_get_fooPtr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>('wire_get_foo');
  late final _wire_get_foo = _wire_get_fooPtr.asFunction<void Function(int)>();

  ffi.Pointer<wire_uint_8_list> new_uint_8_list_0(
    int len,
  ) {
    return _new_uint_8_list_0(
      len,
    );
  }

  late final _new_uint_8_list_0Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<wire_uint_8_list> Function(
              ffi.Int32)>>('new_uint_8_list_0');
  late final _new_uint_8_list_0 = _new_uint_8_list_0Ptr
      .asFunction<ffi.Pointer<wire_uint_8_list> Function(int)>();

  void free_WireSyncReturnStruct(
    WireSyncReturnStruct val,
  ) {
    return _free_WireSyncReturnStruct(
      val,
    );
  }

  late final _free_WireSyncReturnStructPtr =
      _lookup<ffi.NativeFunction<ffi.Void Function(WireSyncReturnStruct)>>(
          'free_WireSyncReturnStruct');
  late final _free_WireSyncReturnStruct = _free_WireSyncReturnStructPtr
      .asFunction<void Function(WireSyncReturnStruct)>();
}

class wire_uint_8_list extends ffi.Struct {
  external ffi.Pointer<ffi.Uint8> ptr;

  @ffi.Int32()
  external int len;
}

typedef DartPostCObjectFnType = ffi.Pointer<
    ffi.NativeFunction<ffi.Bool Function(DartPort, ffi.Pointer<ffi.Void>)>>;
typedef DartPort = ffi.Int64;

### OS

Macos

### Version of `flutter_rust_bridge_codegen`

1.49.0

### Flutter info

```shell
[✓] Flutter (Channel stable, 3.3.6, on macOS 12.3.1 21E258 darwin-arm, locale en-US)
    • Flutter version 3.3.6 on channel stable at /Users/justin/bin/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 6928314d50 (7 days ago), 2022-10-25 16:34:41 -0400
    • Engine revision 3ad69d7be3
    • Dart version 2.18.2
    • DevTools version 2.15.0

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /Users/justin/Library/Android/sdk
    • Platform android-33, build-tools 33.0.0
    • ANDROID_HOME = /Users/justin/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7772763)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 13F100
    • CocoaPods version 1.11.3

[✓] Android Studio (version 2021.1)
    • Android Studio at /Applications/Android Studio.app/Contents
    • 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 11.0.11+0-b60-7772763)

[✓] VS Code (version 1.72.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.50.0

[✓] Connected device (3 available)
    • sdk gphone64 arm64 (mobile) • emulator-5554                        • android-arm64 • Android 12 (API 32) (emulator)
    • iPhone 11 Pro Max (mobile)  • E32C750A-C35F-42AC-9182-12EF486C53BA • ios           • com.apple.CoreSimulator.SimRuntime.iOS-15-5 (simulator)
    • macOS (desktop)             • macos                                • darwin-arm64  • macOS 12.3.1 21E258 darwin-arm

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!


### Version of `clang++`

13.1.6

### Version of `ffigen`

6.1.2

### Additional context

_No response_
welcome[bot] commented 1 year ago

Hi! Thanks for opening your first issue here! :smile:

fzyzcjy commented 1 year ago

looks like flutter_gen not installed

fzyzcjy commented 1 year ago

hmm looks like build_runner throws error, so maybe it is a bug/misuse there

justinmoon commented 1 year ago

After adding flutter_gen: ^5.1.0+1 to packages/api_client/pubspec.yaml and running flutter pub get, I get the following:

flutter_rust_bridge_codegen -r lib/src/rust_bridge/src/api.rs -d lib/src/rust_bridge/bridge_generated.dart -c ../../apps/something/ios/Runner/bridge_generated.h
[2022-11-01T10:47:03Z WARN  lib_flutter_rust_bridge_codegen::source_graph] Skipping unresolvable module io (tried /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io/mod.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io/mod.rs, )
Flutter 3.3.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 6928314d50 (7 days ago) • 2022-10-25 16:34:41 -0400
Engine • revision 3ad69d7be3
Tools • Dart 2.18.2 • DevTools 2.15.0
[2022-11-01T10:47:04Z INFO  lib_flutter_rust_bridge_codegen] Picked config: Opts { rust_input_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/api.rs", dart_output_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/bridge_generated.dart", dart_decl_output_path: None, c_output_path: ["/Users/justin/something/mobile/packages/api_client/../../apps/something/ios/Runner/bridge_generated.h"], rust_crate_dir: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge", rust_output_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated.rs", class_name: "RustBridge", dart_format_line_length: 80, skip_add_mod_to_lib: false, 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: "", manifest_path: "/Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/Cargo.toml", dart_root: Some("/Users/justin/something/mobile/packages/api_client"), build_runner: true, block_index: BlockIndex(0), skip_deps_check: false, wasm_enabled: false, inline_rust: false }
[2022-11-01T10:47:04Z INFO  lib_flutter_rust_bridge_codegen] Phase: Parse source code to AST, then to IR
[2022-11-01T10:47:04Z WARN  lib_flutter_rust_bridge_codegen::source_graph] Skipping unresolvable module io (tried /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/io/mod.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io.rs, /Users/justin/something/mobile/packages/api_client/lib/src/rust_bridge/src/bridge_generated/io/mod.rs, )
[2022-11-01T10:47:04Z INFO  lib_flutter_rust_bridge_codegen] Phase: Transform IR
[2022-11-01T10:47:04Z INFO  lib_flutter_rust_bridge_codegen] Phase: Generate Rust code
[2022-11-01T10:47:04Z INFO  lib_flutter_rust_bridge_codegen] Phase: Generate Dart code
[2022-11-01T10:47:04Z INFO  lib_flutter_rust_bridge_codegen] Phase: Generating Dart bindings for Rust
The pubspec.lock file has changed since the .dart_tool/package_config.json file was generated, please run "flutter pub get" again.
pub finished with exit code 65
[2022-11-01T10:47:05Z WARN  lib_flutter_rust_bridge_codegen::commands] command="sh" "-c" "\"flutter\" \"pub\" \"run\" \"ffigen\" \"--config\" \"/var/folders/97/q5fc74fx3zs0rqkk9_9lb5q00000gn/T/.tmpMeTi93\"" stdout= stderr=
[2022-11-01T10:47:05Z ERROR flutter_rust_bridge_codegen] fatal: ffigen failed:
    stderr: 
    stdout: 
error: Recipe `gen` failed on line 7 with exit code 1

Hmmm. But I get this same error when comment out Foo and get_foo ... so maybe this method of installing flutter_gen isn't right?

fzyzcjy commented 1 year ago

The pubspec.lock file has changed since the .dart_tool/package_config.json file was generated, please run "flutter pub get" again.

justinmoon commented 1 year ago

The pubspec.lock file has changed since the .dart_tool/package_config.json file was generated, please run "flutter pub get" again.

I re-ran flutter pub get a few times from apps/app-name and packages/api_client and still get the same error.

fzyzcjy commented 1 year ago

hmm maybe output debug logs and see what command it runs and see what is the problem. feel free to PR after you find the bug!

justinmoon commented 1 year ago

The root problem was that I had a conflicting version ffigen installed by one of my dependencies.

github-actions[bot] commented 1 year ago

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