You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by te...@apache.org on 2026/05/01 18:48:51 UTC

(opendal) branch agent-dart-frb-upgrade created (now a0f25aaf1)

This is an automated email from the ASF dual-hosted git repository.

TennyZhuang pushed a change to branch agent-dart-frb-upgrade
in repository https://gitbox.apache.org/repos/asf/opendal.git


      at a0f25aaf1 chore(bindings/dart): upgrade flutter_rust_bridge to 2.12.0 and fix native library loading

This branch includes the following new commits:

     new a0f25aaf1 chore(bindings/dart): upgrade flutter_rust_bridge to 2.12.0 and fix native library loading

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(opendal) 01/01: chore(bindings/dart): upgrade flutter_rust_bridge to 2.12.0 and fix native library loading

Posted by te...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

TennyZhuang pushed a commit to branch agent-dart-frb-upgrade
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit a0f25aaf11803c75249f5c55b2082935c03e3cab
Author: tianyizhuang <ti...@tianyizhuangs-Mac-mini.local>
AuthorDate: Sat May 2 02:40:20 2026 +0800

    chore(bindings/dart): upgrade flutter_rust_bridge to 2.12.0 and fix native library loading
    
    Upgrade flutter_rust_bridge from 2.8.0 to 2.12.0 to resolve codegen/runtime
    version mismatch that broke dart test.
    
    Changes:
    - pubspec.yaml: flutter_rust_bridge 2.8.0 → 2.12.0
    - rust/Cargo.toml: flutter_rust_bridge = "=2.8.0" → "=2.12.0"
    - Regenerate all FRB bindings with matching codegen/runtime
    - Fix lib/opendal.dart constructor parameter: schemeStr → scheme (FRB generated),
      but keep Storage.init(schemeStr:) public API wrapper unchanged
    - Fix macOS native library loading: fall back to rust/target/release/ when
      cross-compilation target directory does not exist
    
    No behavior changes; existing tests continue to pass.
---
 bindings/dart/lib/opendal.dart                    | 18 ++++++++++++----
 bindings/dart/lib/src/rust/api/opendal_api.dart   |  6 +++---
 bindings/dart/lib/src/rust/frb_generated.dart     | 25 +++++++++++++----------
 bindings/dart/lib/src/rust/frb_generated.io.dart  |  8 ++++----
 bindings/dart/lib/src/rust/frb_generated.web.dart |  8 ++++----
 bindings/dart/pubspec.yaml                        |  2 +-
 bindings/dart/rust/Cargo.toml                     |  2 +-
 bindings/dart/rust/src/frb_generated.rs           | 18 ++++++++--------
 8 files changed, 50 insertions(+), 37 deletions(-)

diff --git a/bindings/dart/lib/opendal.dart b/bindings/dart/lib/opendal.dart
index e26b2f1aa..1c7d73081 100644
--- a/bindings/dart/lib/opendal.dart
+++ b/bindings/dart/lib/opendal.dart
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import 'dart:io';
+import 'dart:io' as io;
 import 'package:system_info2/system_info2.dart';
 import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated_io.dart';
 import 'src/rust/frb_generated.dart';
@@ -34,7 +34,7 @@ class Storage {
   }) async {
     if (!RustLib.instance.initialized) {
       var path = "rust/target/release/";  // default path
-      final name = Platform.operatingSystem;
+      final name = io.Platform.operatingSystem;
       final arch = SysInfo.kernelArchitecture;
       // Set appropriate binary path based on OS and architecture
       final nameLower = name.toLowerCase();
@@ -79,14 +79,24 @@ class Storage {
           path = "rust/target/x86_64-apple-ios/release/";
         }
       }
-      var config = ExternalLibraryLoaderConfig( // https://github.com/fzyzcjy/flutter_rust_bridge/issues/2460
+      // Fallback to default release dir when cross-compilation target dir
+      // does not exist (e.g. native builds on macOS arm64).
+      final libName = nameLower == "windows"
+          ? "opendal_dart.dll"
+          : nameLower == "linux"
+              ? "libopendal_dart.so"
+              : "libopendal_dart.dylib";
+      if (!io.File("$path$libName").existsSync()) {
+        path = "rust/target/release/";
+      }
+      var config = ExternalLibraryLoaderConfig(
         stem: 'opendal_dart',
         ioDirectory: path,
         webPrefix: 'pkg/',
       );
       await RustLib.init(externalLibrary: await loadExternalLibrary(config));
     }
-    return Storage._(Operator(schemeStr: schemeStr, map: map));
+    return Storage._(Operator(scheme: schemeStr, map: map));
   }
 
   /// Creates a factory function for creating File objects
diff --git a/bindings/dart/lib/src/rust/api/opendal_api.dart b/bindings/dart/lib/src/rust/api/opendal_api.dart
index 24cc40282..9040eb51b 100644
--- a/bindings/dart/lib/src/rust/api/opendal_api.dart
+++ b/bindings/dart/lib/src/rust/api/opendal_api.dart
@@ -1,5 +1,5 @@
 // This file is automatically generated, so please do not edit it.
-// @generated by `flutter_rust_bridge`@ 2.8.0.
+// @generated by `flutter_rust_bridge`@ 2.12.0.
 
 // ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
 
@@ -52,9 +52,9 @@ abstract class Operator implements RustOpaqueInterface {
   bool existsSync({required String path});
 
   factory Operator(
-          {required String schemeStr, required Map<String, String> map}) =>
+          {required String scheme, required Map<String, String> map}) =>
       RustLib.instance.api
-          .crateApiOpendalApiOperatorNew(schemeStr: schemeStr, map: map);
+          .crateApiOpendalApiOperatorNew(scheme: scheme, map: map);
 
   Future<void> rename({required String from, required String to});
 
diff --git a/bindings/dart/lib/src/rust/frb_generated.dart b/bindings/dart/lib/src/rust/frb_generated.dart
index 7faad1e22..2936c2a6f 100644
--- a/bindings/dart/lib/src/rust/frb_generated.dart
+++ b/bindings/dart/lib/src/rust/frb_generated.dart
@@ -1,5 +1,5 @@
 // This file is automatically generated, so please do not edit it.
-// @generated by `flutter_rust_bridge`@ 2.8.0.
+// @generated by `flutter_rust_bridge`@ 2.12.0.
 
 // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field
 
@@ -23,11 +23,13 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
     RustLibApi? api,
     BaseHandler? handler,
     ExternalLibrary? externalLibrary,
+    bool forceSameCodegenVersion = true,
   }) async {
     await instance.initImpl(
       api: api,
       handler: handler,
       externalLibrary: externalLibrary,
+      forceSameCodegenVersion: forceSameCodegenVersion,
     );
   }
 
@@ -63,7 +65,7 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
       kDefaultExternalLibraryLoaderConfig;
 
   @override
-  String get codegenVersion => '2.8.0';
+  String get codegenVersion => '2.12.0';
 
   @override
   int get rustContentHash => 775125233;
@@ -73,6 +75,7 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
     stem: 'opendal_dart',
     ioDirectory: 'rust/target/release/',
     webPrefix: 'pkg/',
+    wasmBindgenName: 'wasm_bindgen',
   );
 }
 
@@ -115,7 +118,7 @@ abstract class RustLibApi extends BaseApi {
       {required Operator that, required String path});
 
   Operator crateApiOpendalApiOperatorNew(
-      {required String schemeStr, required Map<String, String> map});
+      {required String scheme, required Map<String, String> map});
 
   Future<void> crateApiOpendalApiOperatorRename(
       {required Operator that, required String from, required String to});
@@ -548,12 +551,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
 
   @override
   Operator crateApiOpendalApiOperatorNew(
-      {required String schemeStr, required Map<String, String> map}) {
+      {required String scheme, required Map<String, String> map}) {
     return handler.executeSync(SyncTask(
       callFfi: () {
         final serializer = SseSerializer(generalizedFrbRustBinding);
-        sse_encode_String(schemeStr, serializer);
-        sse_encode_Map_String_String(map, serializer);
+        sse_encode_String(scheme, serializer);
+        sse_encode_Map_String_String_None(map, serializer);
         return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 16)!;
       },
       codec: SseCodec(
@@ -562,7 +565,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
         decodeErrorData: null,
       ),
       constMeta: kCrateApiOpendalApiOperatorNewConstMeta,
-      argValues: [schemeStr, map],
+      argValues: [scheme, map],
       apiImpl: this,
     ));
   }
@@ -570,7 +573,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
   TaskConstMeta get kCrateApiOpendalApiOperatorNewConstMeta =>
       const TaskConstMeta(
         debugName: "Operator_new",
-        argNames: ["schemeStr", "map"],
+        argNames: ["scheme", "map"],
       );
 
   @override
@@ -736,7 +739,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
   }
 
   @protected
-  Map<String, String> dco_decode_Map_String_String(dynamic raw) {
+  Map<String, String> dco_decode_Map_String_String_None(dynamic raw) {
     // Codec=Dco (DartCObject based), see doc to use other codecs
     return Map.fromEntries(dco_decode_list_record_string_string(raw)
         .map((e) => MapEntry(e.$1, e.$2)));
@@ -874,7 +877,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
   }
 
   @protected
-  Map<String, String> sse_decode_Map_String_String(
+  Map<String, String> sse_decode_Map_String_String_None(
       SseDeserializer deserializer) {
     // Codec=Sse (Serialization based), see doc to use other codecs
     var inner = sse_decode_list_record_string_string(deserializer);
@@ -1035,7 +1038,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
   }
 
   @protected
-  void sse_encode_Map_String_String(
+  void sse_encode_Map_String_String_None(
       Map<String, String> self, SseSerializer serializer) {
     // Codec=Sse (Serialization based), see doc to use other codecs
     sse_encode_list_record_string_string(
diff --git a/bindings/dart/lib/src/rust/frb_generated.io.dart b/bindings/dart/lib/src/rust/frb_generated.io.dart
index d75bdd3a0..ea65c86c3 100644
--- a/bindings/dart/lib/src/rust/frb_generated.io.dart
+++ b/bindings/dart/lib/src/rust/frb_generated.io.dart
@@ -1,5 +1,5 @@
 // This file is automatically generated, so please do not edit it.
-// @generated by `flutter_rust_bridge`@ 2.8.0.
+// @generated by `flutter_rust_bridge`@ 2.12.0.
 
 // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field
 
@@ -45,7 +45,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
           dynamic raw);
 
   @protected
-  Map<String, String> dco_decode_Map_String_String(dynamic raw);
+  Map<String, String> dco_decode_Map_String_String_None(dynamic raw);
 
   @protected
   Metadata
@@ -114,7 +114,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
           SseDeserializer deserializer);
 
   @protected
-  Map<String, String> sse_decode_Map_String_String(
+  Map<String, String> sse_decode_Map_String_String_None(
       SseDeserializer deserializer);
 
   @protected
@@ -189,7 +189,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
           Operator self, SseSerializer serializer);
 
   @protected
-  void sse_encode_Map_String_String(
+  void sse_encode_Map_String_String_None(
       Map<String, String> self, SseSerializer serializer);
 
   @protected
diff --git a/bindings/dart/lib/src/rust/frb_generated.web.dart b/bindings/dart/lib/src/rust/frb_generated.web.dart
index 3c272d9c6..c2a3b5c78 100644
--- a/bindings/dart/lib/src/rust/frb_generated.web.dart
+++ b/bindings/dart/lib/src/rust/frb_generated.web.dart
@@ -1,5 +1,5 @@
 // This file is automatically generated, so please do not edit it.
-// @generated by `flutter_rust_bridge`@ 2.8.0.
+// @generated by `flutter_rust_bridge`@ 2.12.0.
 
 // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field
 
@@ -47,7 +47,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
           dynamic raw);
 
   @protected
-  Map<String, String> dco_decode_Map_String_String(dynamic raw);
+  Map<String, String> dco_decode_Map_String_String_None(dynamic raw);
 
   @protected
   Metadata
@@ -116,7 +116,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
           SseDeserializer deserializer);
 
   @protected
-  Map<String, String> sse_decode_Map_String_String(
+  Map<String, String> sse_decode_Map_String_String_None(
       SseDeserializer deserializer);
 
   @protected
@@ -191,7 +191,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
           Operator self, SseSerializer serializer);
 
   @protected
-  void sse_encode_Map_String_String(
+  void sse_encode_Map_String_String_None(
       Map<String, String> self, SseSerializer serializer);
 
   @protected
diff --git a/bindings/dart/pubspec.yaml b/bindings/dart/pubspec.yaml
index f7406a0b9..a5695ee51 100644
--- a/bindings/dart/pubspec.yaml
+++ b/bindings/dart/pubspec.yaml
@@ -25,7 +25,7 @@ environment:
   sdk: '>=3.3.0 <4.0.0'
 dependencies:
   lints: ^2.0.1
-  flutter_rust_bridge: 2.8.0
+  flutter_rust_bridge: 2.12.0
   freezed_annotation: ^2.2.0
   collection: ^1.18.0
   system_info2: 4.0.0
diff --git a/bindings/dart/rust/Cargo.toml b/bindings/dart/rust/Cargo.toml
index 6f1f3eef3..176221aeb 100644
--- a/bindings/dart/rust/Cargo.toml
+++ b/bindings/dart/rust/Cargo.toml
@@ -21,7 +21,7 @@ name = "opendal-dart"
 version = "0.1.0"
 
 [dependencies]
-flutter_rust_bridge = "=2.8.0"
+flutter_rust_bridge = "=2.12.0"
 opendal = { path = "../../../core", features = [
   "blocking",
 
diff --git a/bindings/dart/rust/src/frb_generated.rs b/bindings/dart/rust/src/frb_generated.rs
index f867fb21d..d26fd8fc2 100644
--- a/bindings/dart/rust/src/frb_generated.rs
+++ b/bindings/dart/rust/src/frb_generated.rs
@@ -1,5 +1,5 @@
 // This file is automatically generated, so please do not edit it.
-// @generated by `flutter_rust_bridge`@ 2.8.0.
+// @generated by `flutter_rust_bridge`@ 2.12.0.
 
 #![allow(
     non_camel_case_types,
@@ -20,6 +20,7 @@
     clippy::deref_addrof,
     clippy::explicit_auto_deref,
     clippy::borrow_deref_ref,
+    clippy::uninlined_format_args,
     clippy::needless_borrow
 )]
 
@@ -37,7 +38,7 @@ flutter_rust_bridge::frb_generated_boilerplate!(
     default_rust_opaque = RustOpaqueMoi,
     default_rust_auto_opaque = RustAutoOpaqueMoi,
 );
-pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.8.0";
+pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.12.0";
 pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 775125233;
 
 // Section: executor
@@ -834,14 +835,13 @@ fn wire__crate__api__opendal_api__Operator_new_impl(
             };
             let mut deserializer =
                 flutter_rust_bridge::for_generated::SseDeserializer::new(message);
-            let api_scheme_str = <String>::sse_decode(&mut deserializer);
+            let api_scheme = <String>::sse_decode(&mut deserializer);
             let api_map =
                 <std::collections::HashMap<String, String>>::sse_decode(&mut deserializer);
             deserializer.end();
             transform_result_sse::<_, ()>((move || {
                 let output_ok = Result::<_, ()>::Ok(crate::api::opendal_api::Operator::new(
-                    api_scheme_str,
-                    api_map,
+                    api_scheme, api_map,
                 ))?;
                 Ok(output_ok)
             })())
@@ -1154,7 +1154,7 @@ impl SseDecode for Vec<u8> {
     // Codec=Sse (Serialization based), see doc to use other codecs
     fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
         let mut len_ = <i32>::sse_decode(deserializer);
-        let mut ans_ = vec![];
+        let mut ans_ = Vec::with_capacity(len_ as usize);
         for idx_ in 0..len_ {
             ans_.push(<u8>::sse_decode(deserializer));
         }
@@ -1166,7 +1166,7 @@ impl SseDecode for Vec<(String, String)> {
     // Codec=Sse (Serialization based), see doc to use other codecs
     fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
         let mut len_ = <i32>::sse_decode(deserializer);
-        let mut ans_ = vec![];
+        let mut ans_ = Vec::with_capacity(len_ as usize);
         for idx_ in 0..len_ {
             ans_.push(<(String, String)>::sse_decode(deserializer));
         }
@@ -1482,7 +1482,7 @@ impl SseEncode for i32 {
 #[cfg(not(target_family = "wasm"))]
 mod io {
     // This file is automatically generated, so please do not edit it.
-    // @generated by `flutter_rust_bridge`@ 2.8.0.
+    // @generated by `flutter_rust_bridge`@ 2.12.0.
 
     // Section: imports
 
@@ -1533,7 +1533,7 @@ pub use io::*;
 #[cfg(target_family = "wasm")]
 mod web {
     // This file is automatically generated, so please do not edit it.
-    // @generated by `flutter_rust_bridge`@ 2.8.0.
+    // @generated by `flutter_rust_bridge`@ 2.12.0.
 
     // Section: imports