diff --git a/mobile/lib/src/rust/api/usearch_api.dart b/mobile/lib/src/rust/api/usearch_api.dart index 0f68ea774d..67a5f1ad9b 100644 --- a/mobile/lib/src/rust/api/usearch_api.dart +++ b/mobile/lib/src/rust/api/usearch_api.dart @@ -6,56 +6,41 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; import 'package:photos/src/rust/frb_generated.dart'; -// These functions are ignored because they are not marked as `pub`: `create_index`, `ensure_capacity`, `get_index`, `load_index`, `save_index` +// These functions are ignored because they are not marked as `pub`: `ensure_capacity`, `save_index` -Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> getIndexStats({ - required String indexPath, -}) => - RustLib.instance.api.crateApiUsearchApiGetIndexStats(indexPath: indexPath); +// Rust type: RustOpaqueMoi>> +abstract class BoxError implements RustOpaqueInterface {} -Future addVector({ - required String indexPath, - required BigInt key, - required List vector, -}) => - RustLib.instance.api.crateApiUsearchApiAddVector( - indexPath: indexPath, - key: key, - vector: vector, - ); +// Rust type: RustOpaqueMoi> +abstract class Matches implements RustOpaqueInterface {} -Future bulkAddVectors({ - required String indexPath, - required Uint64List keys, - required List vectors, -}) => - RustLib.instance.api.crateApiUsearchApiBulkAddVectors( - indexPath: indexPath, - keys: keys, - vectors: vectors, - ); +// Rust type: RustOpaqueMoi> +abstract class VectorDb implements RustOpaqueInterface { + Future addVector({required BigInt key, required List vector}); -Future<(Uint64List, Float32List)> searchVectors({ - required String indexPath, - required List query, - required BigInt count, -}) => - RustLib.instance.api.crateApiUsearchApiSearchVectors( - indexPath: indexPath, - query: query, - count: count, - ); + Future bulkAddVectors({ + required Uint64List keys, + required List vectors, + }); -Future getVector({ - required String indexPath, - required BigInt key, -}) => - RustLib.instance.api - .crateApiUsearchApiGetVector(indexPath: indexPath, key: key); + Future deleteIndex(); -Future removeVector({required String indexPath, required BigInt key}) => - RustLib.instance.api - .crateApiUsearchApiRemoveVector(indexPath: indexPath, key: key); + Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> getIndexStats(); -Future resetIndex({required String indexPath}) => - RustLib.instance.api.crateApiUsearchApiResetIndex(indexPath: indexPath); + Future getVector({required BigInt key}); + + factory VectorDb({required String filePath, required BigInt dimensions}) => + RustLib.instance.api.crateApiUsearchApiVectorDbNew( + filePath: filePath, + dimensions: dimensions, + ); + + Future removeVector({required BigInt key}); + + Future resetIndex(); + + Future searchVectors({ + required List query, + required BigInt count, + }); +} diff --git a/mobile/lib/src/rust/frb_generated.dart b/mobile/lib/src/rust/frb_generated.dart index 09ccbbe9bc..328ff572b4 100644 --- a/mobile/lib/src/rust/frb_generated.dart +++ b/mobile/lib/src/rust/frb_generated.dart @@ -70,7 +70,7 @@ class RustLib extends BaseEntrypoint { String get codegenVersion => '2.9.0'; @override - int get rustContentHash => 2006111302; + int get rustContentHash => 862168794; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( @@ -81,42 +81,71 @@ class RustLib extends BaseEntrypoint { } abstract class RustLibApi extends BaseApi { - Future crateApiUsearchApiAddVector({ - required String indexPath, + Future crateApiUsearchApiVectorDbAddVector({ + required VectorDb that, required BigInt key, required List vector, }); - Future crateApiUsearchApiBulkAddVectors({ - required String indexPath, + Future crateApiUsearchApiVectorDbBulkAddVectors({ + required VectorDb that, required Uint64List keys, required List vectors, }); - Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> - crateApiUsearchApiGetIndexStats({required String indexPath}); + Future crateApiUsearchApiVectorDbDeleteIndex({required VectorDb that}); - Future crateApiUsearchApiGetVector({ - required String indexPath, + Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> + crateApiUsearchApiVectorDbGetIndexStats({required VectorDb that}); + + Future crateApiUsearchApiVectorDbGetVector({ + required VectorDb that, required BigInt key, }); + VectorDb crateApiUsearchApiVectorDbNew({ + required String filePath, + required BigInt dimensions, + }); + + Future crateApiUsearchApiVectorDbRemoveVector({ + required VectorDb that, + required BigInt key, + }); + + Future crateApiUsearchApiVectorDbResetIndex({required VectorDb that}); + + Future crateApiUsearchApiVectorDbSearchVectors({ + required VectorDb that, + required List query, + required BigInt count, + }); + String crateApiSimpleGreet({required String name}); Future crateApiSimpleInitApp(); - Future crateApiUsearchApiRemoveVector({ - required String indexPath, - required BigInt key, - }); + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_BoxError; - Future crateApiUsearchApiResetIndex({required String indexPath}); + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_BoxError; - Future<(Uint64List, Float32List)> crateApiUsearchApiSearchVectors({ - required String indexPath, - required List query, - required BigInt count, - }); + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_BoxErrorPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Matches; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_Matches; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_MatchesPtr; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_VectorDb; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_VectorDb; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_VectorDbPtr; } class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @@ -128,8 +157,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { }); @override - Future crateApiUsearchApiAddVector({ - required String indexPath, + Future crateApiUsearchApiVectorDbAddVector({ + required VectorDb that, required BigInt key, required List vector, }) { @@ -137,7 +166,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { NormalTask( callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(indexPath, serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); sse_encode_u_64(key, serializer); sse_encode_list_prim_f_32_loose(vector, serializer); pdeCallFfi( @@ -149,24 +181,25 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { }, codec: SseCodec( decodeSuccessData: sse_decode_unit, - decodeErrorData: null, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, ), - constMeta: kCrateApiUsearchApiAddVectorConstMeta, - argValues: [indexPath, key, vector], + constMeta: kCrateApiUsearchApiVectorDbAddVectorConstMeta, + argValues: [that, key, vector], apiImpl: this, ), ); } - TaskConstMeta get kCrateApiUsearchApiAddVectorConstMeta => + TaskConstMeta get kCrateApiUsearchApiVectorDbAddVectorConstMeta => const TaskConstMeta( - debugName: "add_vector", - argNames: ["indexPath", "key", "vector"], + debugName: "VectorDb_add_vector", + argNames: ["that", "key", "vector"], ); @override - Future crateApiUsearchApiBulkAddVectors({ - required String indexPath, + Future crateApiUsearchApiVectorDbBulkAddVectors({ + required VectorDb that, required Uint64List keys, required List vectors, }) { @@ -174,7 +207,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { NormalTask( callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(indexPath, serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); sse_encode_list_prim_u_64_strict(keys, serializer); sse_encode_list_list_prim_f_32_strict(vectors, serializer); pdeCallFfi( @@ -186,29 +222,32 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { }, codec: SseCodec( decodeSuccessData: sse_decode_unit, - decodeErrorData: null, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, ), - constMeta: kCrateApiUsearchApiBulkAddVectorsConstMeta, - argValues: [indexPath, keys, vectors], + constMeta: kCrateApiUsearchApiVectorDbBulkAddVectorsConstMeta, + argValues: [that, keys, vectors], apiImpl: this, ), ); } - TaskConstMeta get kCrateApiUsearchApiBulkAddVectorsConstMeta => + TaskConstMeta get kCrateApiUsearchApiVectorDbBulkAddVectorsConstMeta => const TaskConstMeta( - debugName: "bulk_add_vectors", - argNames: ["indexPath", "keys", "vectors"], + debugName: "VectorDb_bulk_add_vectors", + argNames: ["that", "keys", "vectors"], ); @override - Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> - crateApiUsearchApiGetIndexStats({required String indexPath}) { + Future crateApiUsearchApiVectorDbDeleteIndex({required VectorDb that}) { return handler.executeNormal( NormalTask( callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(indexPath, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); pdeCallFfi( generalizedFrbRustBinding, serializer, @@ -217,33 +256,34 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); }, codec: SseCodec( - decodeSuccessData: sse_decode_record_usize_usize_usize_usize_usize, - decodeErrorData: null, + decodeSuccessData: sse_decode_unit, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, ), - constMeta: kCrateApiUsearchApiGetIndexStatsConstMeta, - argValues: [indexPath], + constMeta: kCrateApiUsearchApiVectorDbDeleteIndexConstMeta, + argValues: [that], apiImpl: this, ), ); } - TaskConstMeta get kCrateApiUsearchApiGetIndexStatsConstMeta => + TaskConstMeta get kCrateApiUsearchApiVectorDbDeleteIndexConstMeta => const TaskConstMeta( - debugName: "get_index_stats", - argNames: ["indexPath"], + debugName: "VectorDb_delete_index", + argNames: ["that"], ); @override - Future crateApiUsearchApiGetVector({ - required String indexPath, - required BigInt key, - }) { + Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> + crateApiUsearchApiVectorDbGetIndexStats({required VectorDb that}) { return handler.executeNormal( NormalTask( callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(indexPath, serializer); - sse_encode_u_64(key, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); pdeCallFfi( generalizedFrbRustBinding, serializer, @@ -252,20 +292,207 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); }, codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_f_32_strict, + decodeSuccessData: sse_decode_record_usize_usize_usize_usize_usize, decodeErrorData: null, ), - constMeta: kCrateApiUsearchApiGetVectorConstMeta, - argValues: [indexPath, key], + constMeta: kCrateApiUsearchApiVectorDbGetIndexStatsConstMeta, + argValues: [that], apiImpl: this, ), ); } - TaskConstMeta get kCrateApiUsearchApiGetVectorConstMeta => + TaskConstMeta get kCrateApiUsearchApiVectorDbGetIndexStatsConstMeta => const TaskConstMeta( - debugName: "get_vector", - argNames: ["indexPath", "key"], + debugName: "VectorDb_get_index_stats", + argNames: ["that"], + ); + + @override + Future crateApiUsearchApiVectorDbGetVector({ + required VectorDb that, + required BigInt key, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); + sse_encode_u_64(key, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 5, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_f_32_strict, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, + ), + constMeta: kCrateApiUsearchApiVectorDbGetVectorConstMeta, + argValues: [that, key], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiUsearchApiVectorDbGetVectorConstMeta => + const TaskConstMeta( + debugName: "VectorDb_get_vector", + argNames: ["that", "key"], + ); + + @override + VectorDb crateApiUsearchApiVectorDbNew({ + required String filePath, + required BigInt dimensions, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(filePath, serializer); + sse_encode_usize(dimensions, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 6)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, + ), + constMeta: kCrateApiUsearchApiVectorDbNewConstMeta, + argValues: [filePath, dimensions], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiUsearchApiVectorDbNewConstMeta => + const TaskConstMeta( + debugName: "VectorDb_new", + argNames: ["filePath", "dimensions"], + ); + + @override + Future crateApiUsearchApiVectorDbRemoveVector({ + required VectorDb that, + required BigInt key, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); + sse_encode_u_64(key, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 7, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_usize, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, + ), + constMeta: kCrateApiUsearchApiVectorDbRemoveVectorConstMeta, + argValues: [that, key], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiUsearchApiVectorDbRemoveVectorConstMeta => + const TaskConstMeta( + debugName: "VectorDb_remove_vector", + argNames: ["that", "key"], + ); + + @override + Future crateApiUsearchApiVectorDbResetIndex({required VectorDb that}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 8, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, + ), + constMeta: kCrateApiUsearchApiVectorDbResetIndexConstMeta, + argValues: [that], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiUsearchApiVectorDbResetIndexConstMeta => + const TaskConstMeta( + debugName: "VectorDb_reset_index", + argNames: ["that"], + ); + + @override + Future crateApiUsearchApiVectorDbSearchVectors({ + required VectorDb that, + required List query, + required BigInt count, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, + serializer, + ); + sse_encode_list_prim_f_32_loose(query, serializer); + sse_encode_usize(count, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 9, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError, + ), + constMeta: kCrateApiUsearchApiVectorDbSearchVectorsConstMeta, + argValues: [that, query, count], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiUsearchApiVectorDbSearchVectorsConstMeta => + const TaskConstMeta( + debugName: "VectorDb_search_vectors", + argNames: ["that", "query", "count"], ); @override @@ -275,7 +502,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(name, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 5)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 10)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -302,7 +529,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { pdeCallFfi( generalizedFrbRustBinding, serializer, - funcId: 6, + funcId: 11, port: port_, ); }, @@ -322,109 +549,101 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { argNames: [], ); - @override - Future crateApiUsearchApiRemoveVector({ - required String indexPath, - required BigInt key, - }) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(indexPath, serializer); - sse_encode_u_64(key, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 7, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_usize, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiRemoveVectorConstMeta, - argValues: [indexPath, key], - apiImpl: this, - ), - ); + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_BoxError => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_BoxError => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_Matches => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_Matches => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_VectorDb => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_VectorDb => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB; + + @protected + BoxError + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return BoxErrorImpl.frbInternalDcoDecode(raw as List); } - TaskConstMeta get kCrateApiUsearchApiRemoveVectorConstMeta => - const TaskConstMeta( - debugName: "remove_vector", - argNames: ["indexPath", "key"], - ); - - @override - Future crateApiUsearchApiResetIndex({required String indexPath}) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(indexPath, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 8, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiResetIndexConstMeta, - argValues: [indexPath], - apiImpl: this, - ), - ); + @protected + Matches + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return MatchesImpl.frbInternalDcoDecode(raw as List); } - TaskConstMeta get kCrateApiUsearchApiResetIndexConstMeta => - const TaskConstMeta( - debugName: "reset_index", - argNames: ["indexPath"], - ); - - @override - Future<(Uint64List, Float32List)> crateApiUsearchApiSearchVectors({ - required String indexPath, - required List query, - required BigInt count, - }) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(indexPath, serializer); - sse_encode_list_prim_f_32_loose(query, serializer); - sse_encode_usize(count, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 9, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiSearchVectorsConstMeta, - argValues: [indexPath, query, count], - apiImpl: this, - ), - ); + @protected + VectorDb + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return VectorDbImpl.frbInternalDcoDecode(raw as List); } - TaskConstMeta get kCrateApiUsearchApiSearchVectorsConstMeta => - const TaskConstMeta( - debugName: "search_vectors", - argNames: ["indexPath", "query", "count"], - ); + @protected + VectorDb + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return VectorDbImpl.frbInternalDcoDecode(raw as List); + } + + @protected + VectorDb + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return VectorDbImpl.frbInternalDcoDecode(raw as List); + } + + @protected + BoxError + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return BoxErrorImpl.frbInternalDcoDecode(raw as List); + } + + @protected + Matches + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return MatchesImpl.frbInternalDcoDecode(raw as List); + } + + @protected + VectorDb + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return VectorDbImpl.frbInternalDcoDecode(raw as List); + } @protected String dco_decode_String(dynamic raw) { @@ -470,22 +689,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return raw as Uint8List; } - @protected - ( - Uint64List, - Float32List - ) dco_decode_record_list_prim_u_64_strict_list_prim_f_32_strict(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_list_prim_u_64_strict(arr[0]), - dco_decode_list_prim_f_32_strict(arr[1]), - ); - } - @protected (BigInt, BigInt, BigInt, BigInt, BigInt) dco_decode_record_usize_usize_usize_usize_usize(dynamic raw) { @@ -527,6 +730,102 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return dcoDecodeU64(raw); } + @protected + BoxError + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return BoxErrorImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + Matches + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return MatchesImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + VectorDb + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return VectorDbImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + VectorDb + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return VectorDbImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + VectorDb + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return VectorDbImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + BoxError + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return BoxErrorImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + Matches + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return MatchesImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + VectorDb + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return VectorDbImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + @protected String sse_decode_String(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -582,17 +881,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return deserializer.buffer.getUint8List(len_); } - @protected - (Uint64List, Float32List) - sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict( - SseDeserializer deserializer, - ) { - // Codec=Sse (Serialization based), see doc to use other codecs - final var_field0 = sse_decode_list_prim_u_64_strict(deserializer); - final var_field1 = sse_decode_list_prim_f_32_strict(deserializer); - return (var_field0, var_field1); - } - @protected (BigInt, BigInt, BigInt, BigInt, BigInt) sse_decode_record_usize_usize_usize_usize_usize( @@ -642,6 +930,110 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return deserializer.buffer.getUint8() != 0; } + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + BoxError self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as BoxErrorImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + Matches self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as MatchesImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as VectorDbImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as VectorDbImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as VectorDbImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + BoxError self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as BoxErrorImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + Matches self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as MatchesImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as VectorDbImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + @protected void sse_encode_String(String self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -708,16 +1100,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer.buffer.putUint8List(self); } - @protected - void sse_encode_record_list_prim_u_64_strict_list_prim_f_32_strict( - (Uint64List, Float32List) self, - SseSerializer serializer, - ) { - // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_prim_u_64_strict(self.$1, serializer); - sse_encode_list_prim_f_32_strict(self.$2, serializer); - } - @protected void sse_encode_record_usize_usize_usize_usize_usize( (BigInt, BigInt, BigInt, BigInt, BigInt) self, @@ -766,3 +1148,111 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer.buffer.putUint8(self ? 1 : 0); } } + +@sealed +class BoxErrorImpl extends RustOpaque implements BoxError { + // Not to be used by end users + BoxErrorImpl.frbInternalDcoDecode(List wire) + : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + BoxErrorImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: + RustLib.instance.api.rust_arc_increment_strong_count_BoxError, + rustArcDecrementStrongCount: + RustLib.instance.api.rust_arc_decrement_strong_count_BoxError, + rustArcDecrementStrongCountPtr: + RustLib.instance.api.rust_arc_decrement_strong_count_BoxErrorPtr, + ); +} + +@sealed +class MatchesImpl extends RustOpaque implements Matches { + // Not to be used by end users + MatchesImpl.frbInternalDcoDecode(List wire) + : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + MatchesImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: + RustLib.instance.api.rust_arc_increment_strong_count_Matches, + rustArcDecrementStrongCount: + RustLib.instance.api.rust_arc_decrement_strong_count_Matches, + rustArcDecrementStrongCountPtr: + RustLib.instance.api.rust_arc_decrement_strong_count_MatchesPtr, + ); +} + +@sealed +class VectorDbImpl extends RustOpaque implements VectorDb { + // Not to be used by end users + VectorDbImpl.frbInternalDcoDecode(List wire) + : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + VectorDbImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: + RustLib.instance.api.rust_arc_increment_strong_count_VectorDb, + rustArcDecrementStrongCount: + RustLib.instance.api.rust_arc_decrement_strong_count_VectorDb, + rustArcDecrementStrongCountPtr: + RustLib.instance.api.rust_arc_decrement_strong_count_VectorDbPtr, + ); + + Future addVector({required BigInt key, required List vector}) => + RustLib.instance.api.crateApiUsearchApiVectorDbAddVector( + that: this, + key: key, + vector: vector, + ); + + Future bulkAddVectors({ + required Uint64List keys, + required List vectors, + }) => + RustLib.instance.api.crateApiUsearchApiVectorDbBulkAddVectors( + that: this, + keys: keys, + vectors: vectors, + ); + + Future deleteIndex() => + RustLib.instance.api.crateApiUsearchApiVectorDbDeleteIndex( + that: this, + ); + + Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> getIndexStats() => + RustLib.instance.api.crateApiUsearchApiVectorDbGetIndexStats( + that: this, + ); + + Future getVector({required BigInt key}) => RustLib.instance.api + .crateApiUsearchApiVectorDbGetVector(that: this, key: key); + + Future removeVector({required BigInt key}) => RustLib.instance.api + .crateApiUsearchApiVectorDbRemoveVector(that: this, key: key); + + Future resetIndex() => + RustLib.instance.api.crateApiUsearchApiVectorDbResetIndex( + that: this, + ); + + Future searchVectors({ + required List query, + required BigInt count, + }) => + RustLib.instance.api.crateApiUsearchApiVectorDbSearchVectors( + that: this, + query: query, + count: count, + ); +} diff --git a/mobile/lib/src/rust/frb_generated.io.dart b/mobile/lib/src/rust/frb_generated.io.dart index 47d45ebfad..7153fb2de4 100644 --- a/mobile/lib/src/rust/frb_generated.io.dart +++ b/mobile/lib/src/rust/frb_generated.io.dart @@ -20,6 +20,63 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { required super.portManager, }); + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_BoxErrorPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynErrorPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_MatchesPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatchesPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_VectorDbPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr; + + @protected + BoxError + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + dynamic raw, + ); + + @protected + Matches + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + + @protected + BoxError + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + dynamic raw, + ); + + @protected + Matches + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + @protected String dco_decode_String(dynamic raw); @@ -41,12 +98,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); - @protected - ( - Uint64List, - Float32List - ) dco_decode_record_list_prim_u_64_strict_list_prim_f_32_strict(dynamic raw); - @protected (BigInt, BigInt, BigInt, BigInt, BigInt) dco_decode_record_usize_usize_usize_usize_usize(dynamic raw); @@ -63,6 +114,54 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected BigInt dco_decode_usize(dynamic raw); + @protected + BoxError + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + SseDeserializer deserializer, + ); + + @protected + Matches + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + + @protected + BoxError + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + SseDeserializer deserializer, + ); + + @protected + Matches + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + @protected String sse_decode_String(SseDeserializer deserializer); @@ -86,12 +185,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); - @protected - (Uint64List, Float32List) - sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict( - SseDeserializer deserializer, - ); - @protected (BigInt, BigInt, BigInt, BigInt, BigInt) sse_decode_record_usize_usize_usize_usize_usize( @@ -116,6 +209,62 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected bool sse_decode_bool(SseDeserializer deserializer); + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + BoxError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + Matches self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + BoxError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + Matches self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + @protected void sse_encode_String(String self, SseSerializer serializer); @@ -152,12 +301,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { SseSerializer serializer, ); - @protected - void sse_encode_record_list_prim_u_64_strict_list_prim_f_32_strict( - (Uint64List, Float32List) self, - SseSerializer serializer, - ); - @protected void sse_encode_record_usize_usize_usize_usize_usize( (BigInt, BigInt, BigInt, BigInt, BigInt) self, @@ -196,4 +339,106 @@ class RustLibWire implements BaseWire { /// The symbols are looked up in [dynamicLibrary]. RustLibWire(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup; + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynErrorPtr = + _lookup)>>( + 'frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynErrorPtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynErrorPtr = + _lookup)>>( + 'frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynErrorPtr + .asFunction)>(); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatchesPtr = + _lookup)>>( + 'frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatchesPtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatchesPtr = + _lookup)>>( + 'frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatchesPtr + .asFunction)>(); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr = + _lookup)>>( + 'frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr = + _lookup)>>( + 'frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr + .asFunction)>(); } diff --git a/mobile/lib/src/rust/frb_generated.web.dart b/mobile/lib/src/rust/frb_generated.web.dart index 10a1839fe4..b91911a6dd 100644 --- a/mobile/lib/src/rust/frb_generated.web.dart +++ b/mobile/lib/src/rust/frb_generated.web.dart @@ -22,6 +22,63 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { required super.portManager, }); + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_BoxErrorPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_MatchesPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_VectorDbPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB; + + @protected + BoxError + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + dynamic raw, + ); + + @protected + Matches + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + + @protected + BoxError + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + dynamic raw, + ); + + @protected + Matches + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + dynamic raw, + ); + + @protected + VectorDb + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + dynamic raw, + ); + @protected String dco_decode_String(dynamic raw); @@ -43,12 +100,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); - @protected - ( - Uint64List, - Float32List - ) dco_decode_record_list_prim_u_64_strict_list_prim_f_32_strict(dynamic raw); - @protected (BigInt, BigInt, BigInt, BigInt, BigInt) dco_decode_record_usize_usize_usize_usize_usize(dynamic raw); @@ -65,6 +116,54 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected BigInt dco_decode_usize(dynamic raw); + @protected + BoxError + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + SseDeserializer deserializer, + ); + + @protected + Matches + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + + @protected + BoxError + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + SseDeserializer deserializer, + ); + + @protected + Matches + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + SseDeserializer deserializer, + ); + + @protected + VectorDb + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + SseDeserializer deserializer, + ); + @protected String sse_decode_String(SseDeserializer deserializer); @@ -88,12 +187,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); - @protected - (Uint64List, Float32List) - sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict( - SseDeserializer deserializer, - ); - @protected (BigInt, BigInt, BigInt, BigInt, BigInt) sse_decode_record_usize_usize_usize_usize_usize( @@ -118,6 +211,62 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected bool sse_decode_bool(SseDeserializer deserializer); + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + BoxError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + Matches self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + BoxError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + Matches self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + VectorDb self, + SseSerializer serializer, + ); + @protected void sse_encode_String(String self, SseSerializer serializer); @@ -154,12 +303,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { SseSerializer serializer, ); - @protected - void sse_encode_record_list_prim_u_64_strict_list_prim_f_32_strict( - (Uint64List, Float32List) self, - SseSerializer serializer, - ); - @protected void sse_encode_record_usize_usize_usize_usize_usize( (BigInt, BigInt, BigInt, BigInt, BigInt) self, @@ -189,6 +332,60 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { class RustLibWire implements BaseWire { RustLibWire.fromExternalLibrary(ExternalLibrary lib); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + int ptr, + ) => + wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + int ptr, + ) => + wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + int ptr, + ) => + wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + int ptr, + ) => + wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + int ptr, + ) => + wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + int ptr, + ) => + wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr, + ); } @JS('wasm_bindgen') @@ -196,4 +393,34 @@ external RustLibWasmModule get wasmModule; @JS() @anonymous -extension type RustLibWasmModule._(JSObject _) implements JSObject {} +extension type RustLibWasmModule._(JSObject _) implements JSObject { + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + int ptr, + ); +} diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index cb616decc0..34683b1fda 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -89,15 +89,19 @@ class _MLDebugSectionWidgetState extends State { final tenKeys = Uint64List.fromList(tenVectors.map((e) => e.fileID).toList()); final indexPath = (await getApplicationSupportDirectory()).path + - "/ml/test1/vector_db"; - final stats = await getIndexStats(indexPath: indexPath); + "/ml/test/vector_db_index.usearch"; + final rustVectorDB = VectorDb( + filePath: indexPath, + dimensions: BigInt.from(tenEmbeddings.first.length), + ); + await rustVectorDB.resetIndex(); + final stats = await rustVectorDB.getIndexStats(); logger.info("vector_db stats: $stats"); - await bulkAddVectors( - indexPath: indexPath, + await rustVectorDB.bulkAddVectors( keys: tenKeys, vectors: tenEmbeddings, ); - final statsAgain = await getIndexStats(indexPath: indexPath); + final statsAgain = await rustVectorDB.getIndexStats(); logger.info("vector_db stats again: $statsAgain"); final size = statsAgain.$1; final capacity = statsAgain.$2; @@ -106,6 +110,7 @@ class _MLDebugSectionWidgetState extends State { context, "Size: $size, Capacity: $capacity, Dimensions: $dimensions", ); + await rustVectorDB.deleteIndex(); } catch (e, s) { logger.warning('Rust bridge failed ', e, s); await showGenericErrorDialog(context: context, error: e); diff --git a/mobile/rust/src/api/usearch_api.rs b/mobile/rust/src/api/usearch_api.rs index 7405bb0b26..9a2e8f69de 100644 --- a/mobile/rust/src/api/usearch_api.rs +++ b/mobile/rust/src/api/usearch_api.rs @@ -1,114 +1,124 @@ -use usearch::{Index, IndexOptions, MetricKind, ScalarKind}; +use flutter_rust_bridge::frb; +use usearch::{ffi::Matches, Index, IndexOptions, MetricKind, ScalarKind}; -// Create DB index -fn create_index() -> Index { - let mut options = IndexOptions::default(); - options.dimensions = 512; // Set the number of dimensions for vectors - options.metric = MetricKind::Cos; // Use cosine similarity for distance measurement - options.quantization = ScalarKind::F32; // Use 32-bit floating point numbers - options.connectivity = 0; // zero for auto - options.expansion_add = 0; // zero for auto - options.expansion_search = 0; // zero for auto +use std::error::Error; +use std::path::PathBuf; - let index = Index::new(&options).expect("Failed to create index."); - index.reserve(1000).expect("Failed to reserve capacity."); - index +#[frb(opaque)] +pub struct VectorDB { + index: Index, + path: PathBuf, } -// Get the DB -fn get_index(file_path: &str) -> Index { - let file_exists: bool = std::path::Path::new(file_path).try_exists().unwrap(); - let index = create_index(); - if file_exists { - // Load into the existing index instead of creating a new variable - index.load(file_path).expect("Failed to load index."); - } else { - save_index(&index, file_path); +impl VectorDB { + #[frb(sync)] + pub fn new(file_path: &str, dimensions: usize) -> Result> { + let path = PathBuf::from(file_path); + let file_exists = path.try_exists().unwrap_or(false); + + let mut options = IndexOptions::default(); + options.dimensions = dimensions; + options.metric = MetricKind::IP; + options.quantization = ScalarKind::F32; + options.connectivity = 0; // auto + options.expansion_add = 0; // auto + options.expansion_search = 0; // auto + + let index = Index::new(&options)?; + index.reserve(1000)?; + + let db = Self { index, path }; + + if file_exists { + println!("Loading index from disk."); + db.index.load(file_path)?; + } else { + println!("Creating new index."); + db.save_index()?; + } + Ok(db) } - index -} -// Save to disk -fn save_index(index: &Index, file_path: &str) { - // Ensure directory exists - if let Some(parent) = std::path::Path::new(file_path).parent() { - std::fs::create_dir_all(parent).expect("Failed to create directory for index."); + fn save_index(&self) -> Result<(), Box> { + // Ensure directory exists + if let Some(parent) = self.path.parent() { + std::fs::create_dir_all(parent)?; + } + self.index.save(self.path.to_str().unwrap())?; + Ok(()) } - index.save(file_path).expect("Failed to save index."); -} -// Changes to DB index -fn ensure_capacity(index: &Index, margin: usize) { - let current_size = index.size(); - let capacity = index.capacity(); - if current_size + margin >= capacity { - index - .reserve(current_size + margin) - .expect("Failed to reserve capacity."); + fn ensure_capacity(&self, margin: usize) -> Result<(), Box> { + let current_size = self.index.size(); + let capacity = self.index.capacity(); + if current_size + margin >= capacity { + self.index.reserve(current_size + margin)?; + } + Ok(()) + } + + pub fn add_vector(&mut self, key: u64, vector: &Vec) -> Result<(), Box> { + self.ensure_capacity(1)?; + self.index.add(key, vector)?; + self.save_index()?; + Ok(()) + } + + pub fn bulk_add_vectors( + &mut self, + keys: Vec, + vectors: &Vec>, + ) -> Result<(), Box> { + self.ensure_capacity(keys.len())?; + for (key, vector) in keys.iter().zip(vectors.iter()) { + self.index.add(*key, vector)?; + } + self.save_index()?; + Ok(()) + } + + pub fn search_vectors( + &self, + query: &Vec, + count: usize, + ) -> Result> { + Ok(self.index.search(query, count)?) + } + + pub fn get_vector(&self, key: u64) -> Result, Box> { + let mut vector: Vec = vec![0.0; self.index.dimensions()]; + self.index.get(key, &mut vector)?; + Ok(vector) + } + + pub fn remove_vector(&mut self, key: u64) -> Result> { + let removed_count = self.index.remove(key)?; + self.save_index()?; + Ok(removed_count) + } + + pub fn reset_index(&mut self) -> Result<(), Box> { + self.index.reset()?; + self.save_index()?; + Ok(()) + } + + pub fn delete_index(self) -> Result<(), Box> { + if self.path.exists() { + std::fs::remove_file(&self.path)?; + } else { + println!("Index file does not exist."); + } + Ok(()) + } + + pub fn get_index_stats(self) -> (usize, usize, usize, usize, usize) { + let size = self.index.size(); + let capacity = self.index.capacity(); + let dimensions = self.index.dimensions(); + let expansion_add = self.index.expansion_add(); + let expansion_search = self.index.expansion_search(); + + (size, capacity, dimensions, expansion_add, expansion_search) } } - -pub fn get_index_stats(index_path: &str) -> (usize, usize, usize, usize, usize) { - let index = get_index(index_path); - let size = index.size(); - let capacity = index.capacity(); - let dimensions = index.dimensions(); - let expansion_add = index.expansion_add(); - let expansion_search = index.expansion_search(); - - (size, capacity, dimensions, expansion_add, expansion_search) -} - -// Add to index -pub fn add_vector(index_path: &str, key: u64, vector: &Vec) { - let index = get_index(index_path); - ensure_capacity(&index, 1); - index.add(key, vector).expect("Failed to add vector."); - save_index(&index, index_path); -} - -// Bulk add to index -pub fn bulk_add_vectors(index_path: &str, keys: Vec, vectors: &Vec>) { - let index = get_index(index_path); - ensure_capacity(&index, keys.len()); - for (key, vector) in keys.iter().zip(vectors.iter()) { - index.add(*key, vector).expect("Failed to add vector."); - } - save_index(&index, index_path); -} - -// Search in index -pub fn search_vectors(index_path: &str, query: &Vec, count: usize) -> (Vec, Vec) { - let index: Index = get_index(index_path); - let results = index.search(query, count).expect("Search failed."); - - (results.keys, results.distances) -} - -// Read from index -pub fn get_vector(index_path: &str, key: u64) -> Vec { - let index = get_index(index_path); - let mut vector: Vec = vec![0.0; index.dimensions()]; - let _ = index - .get(key, &mut vector) - .expect("Failed to export vector."); - - vector -} - -// Delete from index -pub fn remove_vector(index_path: &str, key: u64) -> usize { - let index = get_index(index_path); - let removed_count = index.remove(key).expect("Failed to remove vector."); - save_index(&index, index_path); - - removed_count -} - -// Reset index -pub fn reset_index(index_path: &str) { - let index = get_index(index_path); - index.reset().expect("Failed to clear index."); - - save_index(&index, index_path); -} diff --git a/mobile/rust/src/frb_generated.rs b/mobile/rust/src/frb_generated.rs index 848c851d3d..4e0837627f 100644 --- a/mobile/rust/src/frb_generated.rs +++ b/mobile/rust/src/frb_generated.rs @@ -25,6 +25,7 @@ // Section: imports +use crate::api::usearch_api::*; 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}; @@ -37,7 +38,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.9.0"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 2006111302; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 862168794; // Section: executor @@ -45,7 +46,7 @@ flutter_rust_bridge::frb_generated_default_handler!(); // Section: wire_funcs -fn wire__crate__api__usearch_api__add_vector_impl( +fn wire__crate__api__usearch_api__VectorDb_add_vector_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -53,7 +54,7 @@ fn wire__crate__api__usearch_api__add_vector_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "add_vector", + debug_name: "VectorDb_add_vector", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -67,22 +68,40 @@ fn wire__crate__api__usearch_api__add_vector_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_index_path = ::sse_decode(&mut deserializer); + let api_that = , + >>::sse_decode(&mut deserializer); let api_key = ::sse_decode(&mut deserializer); let api_vector = >::sse_decode(&mut deserializer); deserializer.end(); move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok({ - crate::api::usearch_api::add_vector(&api_index_path, api_key, &api_vector); - })?; + transform_result_sse::<_, Box>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref_mut()), + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::usearch_api::VectorDB::add_vector( + &mut *api_that_guard, + api_key, + &api_vector, + )?; Ok(output_ok) })()) } }, ) } -fn wire__crate__api__usearch_api__bulk_add_vectors_impl( +fn wire__crate__api__usearch_api__VectorDb_bulk_add_vectors_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -90,7 +109,7 @@ fn wire__crate__api__usearch_api__bulk_add_vectors_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "bulk_add_vectors", + debug_name: "VectorDb_bulk_add_vectors", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -104,26 +123,40 @@ fn wire__crate__api__usearch_api__bulk_add_vectors_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_index_path = ::sse_decode(&mut deserializer); + let api_that = , + >>::sse_decode(&mut deserializer); let api_keys = >::sse_decode(&mut deserializer); let api_vectors = >>::sse_decode(&mut deserializer); deserializer.end(); move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok({ - crate::api::usearch_api::bulk_add_vectors( - &api_index_path, - api_keys, - &api_vectors, - ); - })?; + transform_result_sse::<_, Box>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref_mut()), + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::usearch_api::VectorDB::bulk_add_vectors( + &mut *api_that_guard, + api_keys, + &api_vectors, + )?; Ok(output_ok) })()) } }, ) } -fn wire__crate__api__usearch_api__get_index_stats_impl( +fn wire__crate__api__usearch_api__VectorDb_delete_index_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -131,7 +164,7 @@ fn wire__crate__api__usearch_api__get_index_stats_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_index_stats", + debug_name: "VectorDb_delete_index", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -145,20 +178,53 @@ fn wire__crate__api__usearch_api__get_index_stats_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_index_path = ::sse_decode(&mut deserializer); + let api_that = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, Box>((move || { + let output_ok = crate::api::usearch_api::VectorDB::delete_index(api_that)?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__usearch_api__VectorDb_get_index_stats_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::TaskInfo { + debug_name: "VectorDb_get_index_stats", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer); deserializer.end(); move |context| { transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::usearch_api::get_index_stats( - &api_index_path, - ))?; + let output_ok = Result::<_, ()>::Ok( + crate::api::usearch_api::VectorDB::get_index_stats(api_that), + )?; Ok(output_ok) })()) } }, ) } -fn wire__crate__api__usearch_api__get_vector_impl( +fn wire__crate__api__usearch_api__VectorDb_get_vector_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -166,7 +232,7 @@ fn wire__crate__api__usearch_api__get_vector_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_vector", + debug_name: "VectorDb_get_vector", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -180,15 +246,219 @@ fn wire__crate__api__usearch_api__get_vector_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_index_path = ::sse_decode(&mut deserializer); + let api_that = , + >>::sse_decode(&mut deserializer); let api_key = ::sse_decode(&mut deserializer); deserializer.end(); move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::usearch_api::get_vector( - &api_index_path, + transform_result_sse::<_, Box>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = + crate::api::usearch_api::VectorDB::get_vector(&*api_that_guard, api_key)?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__usearch_api__VectorDb_new_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::TaskInfo { + debug_name: "VectorDb_new", + 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_file_path = ::sse_decode(&mut deserializer); + let api_dimensions = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, Box>((move || { + let output_ok = + crate::api::usearch_api::VectorDB::new(&api_file_path, api_dimensions)?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__usearch_api__VectorDb_remove_vector_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::TaskInfo { + debug_name: "VectorDb_remove_vector", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_key = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, Box>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref_mut()), + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::usearch_api::VectorDB::remove_vector( + &mut *api_that_guard, api_key, - ))?; + )?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__usearch_api__VectorDb_reset_index_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::TaskInfo { + debug_name: "VectorDb_reset_index", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, Box>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref_mut()), + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = + crate::api::usearch_api::VectorDB::reset_index(&mut *api_that_guard)?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__usearch_api__VectorDb_search_vectors_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::TaskInfo { + debug_name: "VectorDb_search_vectors", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_query = >::sse_decode(&mut deserializer); + let api_count = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, Box>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::usearch_api::VectorDB::search_vectors( + &*api_that_guard, + &api_query, + api_count, + )?; Ok(output_ok) })()) } @@ -259,120 +529,79 @@ fn wire__crate__api__simple__init_app_impl( }, ) } -fn wire__crate__api__usearch_api__remove_vector_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::TaskInfo { - debug_name: "remove_vector", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_index_path = ::sse_decode(&mut deserializer); - let api_key = ::sse_decode(&mut deserializer); - deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::usearch_api::remove_vector( - &api_index_path, - api_key, - ))?; - Ok(output_ok) - })()) - } - }, - ) -} -fn wire__crate__api__usearch_api__reset_index_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::TaskInfo { - debug_name: "reset_index", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_index_path = ::sse_decode(&mut deserializer); - deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok({ - crate::api::usearch_api::reset_index(&api_index_path); - })?; - Ok(output_ok) - })()) - } - }, - ) -} -fn wire__crate__api__usearch_api__search_vectors_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::TaskInfo { - debug_name: "search_vectors", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_index_path = ::sse_decode(&mut deserializer); - let api_query = >::sse_decode(&mut deserializer); - let api_count = ::sse_decode(&mut deserializer); - deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::usearch_api::search_vectors( - &api_index_path, - &api_query, - api_count, - ))?; - Ok(output_ok) - })()) - } - }, - ) -} + +// Section: related_funcs + +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); // Section: dart2rust +impl SseDecode for Box { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Matches { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for VectorDB { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + impl SseDecode for String { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -436,15 +665,6 @@ impl SseDecode for Vec { } } -impl SseDecode for (Vec, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); - } -} - impl SseDecode for (usize, usize, usize, usize, usize) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -506,16 +726,55 @@ fn pde_ffi_dispatcher_primary_impl( ) { // Codec=Pde (Serialization + dispatch), see doc to use other codecs match func_id { - 1 => wire__crate__api__usearch_api__add_vector_impl(port, ptr, rust_vec_len, data_len), - 2 => { - wire__crate__api__usearch_api__bulk_add_vectors_impl(port, ptr, rust_vec_len, data_len) - } - 3 => wire__crate__api__usearch_api__get_index_stats_impl(port, ptr, rust_vec_len, data_len), - 4 => wire__crate__api__usearch_api__get_vector_impl(port, ptr, rust_vec_len, data_len), - 6 => wire__crate__api__simple__init_app_impl(port, ptr, rust_vec_len, data_len), - 7 => wire__crate__api__usearch_api__remove_vector_impl(port, ptr, rust_vec_len, data_len), - 8 => wire__crate__api__usearch_api__reset_index_impl(port, ptr, rust_vec_len, data_len), - 9 => wire__crate__api__usearch_api__search_vectors_impl(port, ptr, rust_vec_len, data_len), + 1 => wire__crate__api__usearch_api__VectorDb_add_vector_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 2 => wire__crate__api__usearch_api__VectorDb_bulk_add_vectors_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 3 => wire__crate__api__usearch_api__VectorDb_delete_index_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 4 => wire__crate__api__usearch_api__VectorDb_get_index_stats_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 5 => wire__crate__api__usearch_api__VectorDb_get_vector_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 7 => wire__crate__api__usearch_api__VectorDb_remove_vector_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 8 => wire__crate__api__usearch_api__VectorDb_reset_index_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 9 => wire__crate__api__usearch_api__VectorDb_search_vectors_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 11 => wire__crate__api__simple__init_app_impl(port, ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -528,13 +787,111 @@ fn pde_ffi_dispatcher_sync_impl( ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { // Codec=Pde (Serialization + dispatch), see doc to use other codecs match func_id { - 5 => wire__crate__api__simple__greet_impl(ptr, rust_vec_len, data_len), + 6 => wire__crate__api__usearch_api__VectorDb_new_impl(ptr, rust_vec_len, data_len), + 10 => wire__crate__api__simple__greet_impl(ptr, rust_vec_len, data_len), _ => unreachable!(), } } // Section: rust2dart +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper> {} + +impl flutter_rust_bridge::IntoIntoDart>> for Box { + fn into_into_dart(self) -> FrbWrapper> { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for Matches { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for VectorDB { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +impl SseEncode for Box { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for Matches { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for VectorDB { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + impl SseEncode for String { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -589,14 +946,6 @@ impl SseEncode for Vec { } } -impl SseEncode for (Vec, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); - } -} - impl SseEncode for (usize, usize, usize, usize, usize) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -659,6 +1008,7 @@ mod io { // Section: imports use super::*; + use crate::api::usearch_api::*; use flutter_rust_bridge::for_generated::byteorder::{ NativeEndian, ReadBytesExt, WriteBytesExt, }; @@ -668,6 +1018,48 @@ mod io { // Section: boilerplate flutter_rust_bridge::frb_generated_boilerplate_io!(); + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } } #[cfg(not(target_family = "wasm"))] pub use io::*; @@ -681,6 +1073,7 @@ mod web { // Section: imports use super::*; + use crate::api::usearch_api::*; use flutter_rust_bridge::for_generated::byteorder::{ NativeEndian, ReadBytesExt, WriteBytesExt, }; @@ -692,6 +1085,48 @@ mod web { // Section: boilerplate flutter_rust_bridge::frb_generated_boilerplate_web!(); + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBoxdynError( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMatches( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } } #[cfg(target_family = "wasm")] pub use web::*;