kreuzberg 4.0.0.pre.rc.29 → 4.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +0 -6
- data/.rubocop.yaml +534 -1
- data/Gemfile +2 -1
- data/Gemfile.lock +28 -116
- data/README.md +269 -629
- data/Rakefile +0 -9
- data/Steepfile +4 -8
- data/examples/async_patterns.rb +58 -1
- data/ext/kreuzberg_rb/extconf.rb +5 -35
- data/ext/kreuzberg_rb/native/Cargo.toml +16 -55
- data/ext/kreuzberg_rb/native/build.rs +14 -12
- data/ext/kreuzberg_rb/native/include/ieeefp.h +1 -1
- data/ext/kreuzberg_rb/native/include/msvc_compat/strings.h +1 -1
- data/ext/kreuzberg_rb/native/include/strings.h +2 -2
- data/ext/kreuzberg_rb/native/include/unistd.h +1 -1
- data/ext/kreuzberg_rb/native/src/lib.rs +34 -897
- data/extconf.rb +6 -38
- data/kreuzberg.gemspec +20 -114
- data/lib/kreuzberg/api_proxy.rb +18 -2
- data/lib/kreuzberg/cache_api.rb +0 -22
- data/lib/kreuzberg/cli.rb +10 -2
- data/lib/kreuzberg/cli_proxy.rb +10 -0
- data/lib/kreuzberg/config.rb +22 -274
- data/lib/kreuzberg/errors.rb +7 -73
- data/lib/kreuzberg/extraction_api.rb +8 -237
- data/lib/kreuzberg/mcp_proxy.rb +11 -2
- data/lib/kreuzberg/ocr_backend_protocol.rb +73 -0
- data/lib/kreuzberg/post_processor_protocol.rb +71 -0
- data/lib/kreuzberg/result.rb +33 -151
- data/lib/kreuzberg/setup_lib_path.rb +2 -22
- data/lib/kreuzberg/validator_protocol.rb +73 -0
- data/lib/kreuzberg/version.rb +1 -1
- data/lib/kreuzberg.rb +13 -27
- data/pkg/kreuzberg-4.0.0.rc1.gem +0 -0
- data/sig/kreuzberg.rbs +12 -105
- data/spec/binding/cache_spec.rb +22 -22
- data/spec/binding/cli_proxy_spec.rb +4 -2
- data/spec/binding/cli_spec.rb +11 -12
- data/spec/binding/config_spec.rb +0 -74
- data/spec/binding/config_validation_spec.rb +6 -100
- data/spec/binding/error_handling_spec.rb +97 -283
- data/spec/binding/plugins/ocr_backend_spec.rb +8 -8
- data/spec/binding/plugins/postprocessor_spec.rb +11 -11
- data/spec/binding/plugins/validator_spec.rb +13 -12
- data/spec/examples.txt +104 -0
- data/spec/fixtures/config.toml +1 -0
- data/spec/fixtures/config.yaml +1 -0
- data/spec/fixtures/invalid_config.toml +1 -0
- data/spec/smoke/package_spec.rb +3 -2
- data/spec/spec_helper.rb +3 -1
- data/vendor/kreuzberg/Cargo.toml +67 -192
- data/vendor/kreuzberg/README.md +9 -97
- data/vendor/kreuzberg/build.rs +194 -516
- data/vendor/kreuzberg/src/api/handlers.rs +9 -130
- data/vendor/kreuzberg/src/api/mod.rs +3 -18
- data/vendor/kreuzberg/src/api/server.rs +71 -236
- data/vendor/kreuzberg/src/api/types.rs +7 -43
- data/vendor/kreuzberg/src/bin/profile_extract.rs +455 -0
- data/vendor/kreuzberg/src/cache/mod.rs +3 -27
- data/vendor/kreuzberg/src/chunking/mod.rs +79 -1705
- data/vendor/kreuzberg/src/core/batch_mode.rs +0 -60
- data/vendor/kreuzberg/src/core/config.rs +23 -905
- data/vendor/kreuzberg/src/core/extractor.rs +106 -403
- data/vendor/kreuzberg/src/core/io.rs +2 -4
- data/vendor/kreuzberg/src/core/mime.rs +12 -2
- data/vendor/kreuzberg/src/core/mod.rs +3 -22
- data/vendor/kreuzberg/src/core/pipeline.rs +78 -395
- data/vendor/kreuzberg/src/embeddings.rs +21 -169
- data/vendor/kreuzberg/src/error.rs +2 -2
- data/vendor/kreuzberg/src/extraction/archive.rs +31 -36
- data/vendor/kreuzberg/src/extraction/docx.rs +1 -365
- data/vendor/kreuzberg/src/extraction/email.rs +11 -12
- data/vendor/kreuzberg/src/extraction/excel.rs +129 -138
- data/vendor/kreuzberg/src/extraction/html.rs +170 -1447
- data/vendor/kreuzberg/src/extraction/image.rs +14 -138
- data/vendor/kreuzberg/src/extraction/libreoffice.rs +3 -13
- data/vendor/kreuzberg/src/extraction/mod.rs +5 -21
- data/vendor/kreuzberg/src/extraction/office_metadata/mod.rs +0 -2
- data/vendor/kreuzberg/src/extraction/pandoc/batch.rs +275 -0
- data/vendor/kreuzberg/src/extraction/pandoc/mime_types.rs +178 -0
- data/vendor/kreuzberg/src/extraction/pandoc/mod.rs +491 -0
- data/vendor/kreuzberg/src/extraction/pandoc/server.rs +496 -0
- data/vendor/kreuzberg/src/extraction/pandoc/subprocess.rs +1188 -0
- data/vendor/kreuzberg/src/extraction/pandoc/version.rs +162 -0
- data/vendor/kreuzberg/src/extraction/pptx.rs +94 -196
- data/vendor/kreuzberg/src/extraction/structured.rs +4 -5
- data/vendor/kreuzberg/src/extraction/table.rs +1 -2
- data/vendor/kreuzberg/src/extraction/text.rs +10 -18
- data/vendor/kreuzberg/src/extractors/archive.rs +0 -22
- data/vendor/kreuzberg/src/extractors/docx.rs +148 -69
- data/vendor/kreuzberg/src/extractors/email.rs +9 -37
- data/vendor/kreuzberg/src/extractors/excel.rs +40 -81
- data/vendor/kreuzberg/src/extractors/html.rs +173 -182
- data/vendor/kreuzberg/src/extractors/image.rs +8 -32
- data/vendor/kreuzberg/src/extractors/mod.rs +10 -171
- data/vendor/kreuzberg/src/extractors/pandoc.rs +201 -0
- data/vendor/kreuzberg/src/extractors/pdf.rs +64 -329
- data/vendor/kreuzberg/src/extractors/pptx.rs +34 -79
- data/vendor/kreuzberg/src/extractors/structured.rs +0 -16
- data/vendor/kreuzberg/src/extractors/text.rs +7 -30
- data/vendor/kreuzberg/src/extractors/xml.rs +8 -27
- data/vendor/kreuzberg/src/keywords/processor.rs +1 -9
- data/vendor/kreuzberg/src/keywords/rake.rs +1 -0
- data/vendor/kreuzberg/src/language_detection/mod.rs +51 -94
- data/vendor/kreuzberg/src/lib.rs +5 -17
- data/vendor/kreuzberg/src/mcp/mod.rs +1 -4
- data/vendor/kreuzberg/src/mcp/server.rs +21 -145
- data/vendor/kreuzberg/src/ocr/mod.rs +0 -2
- data/vendor/kreuzberg/src/ocr/processor.rs +8 -19
- data/vendor/kreuzberg/src/ocr/tesseract_backend.rs +0 -2
- data/vendor/kreuzberg/src/pdf/error.rs +1 -93
- data/vendor/kreuzberg/src/pdf/metadata.rs +100 -263
- data/vendor/kreuzberg/src/pdf/mod.rs +2 -33
- data/vendor/kreuzberg/src/pdf/rendering.rs +12 -12
- data/vendor/kreuzberg/src/pdf/table.rs +64 -61
- data/vendor/kreuzberg/src/pdf/text.rs +24 -416
- data/vendor/kreuzberg/src/plugins/extractor.rs +8 -40
- data/vendor/kreuzberg/src/plugins/mod.rs +0 -3
- data/vendor/kreuzberg/src/plugins/ocr.rs +14 -22
- data/vendor/kreuzberg/src/plugins/processor.rs +1 -10
- data/vendor/kreuzberg/src/plugins/registry.rs +0 -15
- data/vendor/kreuzberg/src/plugins/validator.rs +8 -20
- data/vendor/kreuzberg/src/stopwords/mod.rs +2 -2
- data/vendor/kreuzberg/src/text/mod.rs +0 -8
- data/vendor/kreuzberg/src/text/quality.rs +15 -28
- data/vendor/kreuzberg/src/text/string_utils.rs +10 -22
- data/vendor/kreuzberg/src/text/token_reduction/core.rs +50 -86
- data/vendor/kreuzberg/src/text/token_reduction/filters.rs +16 -37
- data/vendor/kreuzberg/src/text/token_reduction/simd_text.rs +1 -2
- data/vendor/kreuzberg/src/types.rs +67 -907
- data/vendor/kreuzberg/src/utils/mod.rs +0 -14
- data/vendor/kreuzberg/src/utils/quality.rs +3 -12
- data/vendor/kreuzberg/tests/api_tests.rs +0 -506
- data/vendor/kreuzberg/tests/archive_integration.rs +0 -2
- data/vendor/kreuzberg/tests/batch_orchestration.rs +12 -57
- data/vendor/kreuzberg/tests/batch_processing.rs +8 -32
- data/vendor/kreuzberg/tests/chunking_offset_demo.rs +92 -0
- data/vendor/kreuzberg/tests/concurrency_stress.rs +8 -40
- data/vendor/kreuzberg/tests/config_features.rs +1 -33
- data/vendor/kreuzberg/tests/config_loading_tests.rs +39 -16
- data/vendor/kreuzberg/tests/core_integration.rs +9 -35
- data/vendor/kreuzberg/tests/csv_integration.rs +81 -71
- data/vendor/kreuzberg/tests/docx_metadata_extraction_test.rs +25 -23
- data/vendor/kreuzberg/tests/email_integration.rs +1 -3
- data/vendor/kreuzberg/tests/error_handling.rs +34 -43
- data/vendor/kreuzberg/tests/format_integration.rs +1 -7
- data/vendor/kreuzberg/tests/helpers/mod.rs +0 -60
- data/vendor/kreuzberg/tests/image_integration.rs +0 -2
- data/vendor/kreuzberg/tests/mime_detection.rs +16 -17
- data/vendor/kreuzberg/tests/ocr_configuration.rs +0 -4
- data/vendor/kreuzberg/tests/ocr_errors.rs +0 -22
- data/vendor/kreuzberg/tests/ocr_quality.rs +0 -2
- data/vendor/kreuzberg/tests/pandoc_integration.rs +503 -0
- data/vendor/kreuzberg/tests/pdf_integration.rs +0 -2
- data/vendor/kreuzberg/tests/pipeline_integration.rs +2 -36
- data/vendor/kreuzberg/tests/plugin_ocr_backend_test.rs +0 -5
- data/vendor/kreuzberg/tests/plugin_postprocessor_test.rs +1 -17
- data/vendor/kreuzberg/tests/plugin_system.rs +0 -6
- data/vendor/kreuzberg/tests/registry_integration_tests.rs +22 -2
- data/vendor/kreuzberg/tests/security_validation.rs +1 -13
- data/vendor/kreuzberg/tests/test_fastembed.rs +23 -45
- metadata +25 -171
- data/.rubocop.yml +0 -543
- data/ext/kreuzberg_rb/native/.cargo/config.toml +0 -23
- data/ext/kreuzberg_rb/native/Cargo.lock +0 -7619
- data/lib/kreuzberg/error_context.rb +0 -136
- data/lib/kreuzberg/types.rb +0 -170
- data/lib/libpdfium.so +0 -0
- data/spec/binding/async_operations_spec.rb +0 -473
- data/spec/binding/batch_operations_spec.rb +0 -595
- data/spec/binding/batch_spec.rb +0 -359
- data/spec/binding/config_result_spec.rb +0 -377
- data/spec/binding/embeddings_spec.rb +0 -816
- data/spec/binding/error_recovery_spec.rb +0 -488
- data/spec/binding/font_config_spec.rb +0 -220
- data/spec/binding/images_spec.rb +0 -738
- data/spec/binding/keywords_extraction_spec.rb +0 -600
- data/spec/binding/metadata_types_spec.rb +0 -1228
- data/spec/binding/pages_extraction_spec.rb +0 -471
- data/spec/binding/tables_spec.rb +0 -641
- data/spec/unit/config/chunking_config_spec.rb +0 -213
- data/spec/unit/config/embedding_config_spec.rb +0 -343
- data/spec/unit/config/extraction_config_spec.rb +0 -438
- data/spec/unit/config/font_config_spec.rb +0 -285
- data/spec/unit/config/hierarchy_config_spec.rb +0 -314
- data/spec/unit/config/image_extraction_config_spec.rb +0 -209
- data/spec/unit/config/image_preprocessing_config_spec.rb +0 -249
- data/spec/unit/config/keyword_config_spec.rb +0 -229
- data/spec/unit/config/language_detection_config_spec.rb +0 -258
- data/spec/unit/config/ocr_config_spec.rb +0 -171
- data/spec/unit/config/page_config_spec.rb +0 -221
- data/spec/unit/config/pdf_config_spec.rb +0 -267
- data/spec/unit/config/postprocessor_config_spec.rb +0 -290
- data/spec/unit/config/tesseract_config_spec.rb +0 -181
- data/spec/unit/config/token_reduction_config_spec.rb +0 -251
- data/test/metadata_types_test.rb +0 -959
- data/vendor/Cargo.toml +0 -61
- data/vendor/kreuzberg/examples/bench_fixes.rs +0 -71
- data/vendor/kreuzberg/examples/test_pdfium_fork.rs +0 -62
- data/vendor/kreuzberg/src/chunking/processor.rs +0 -219
- data/vendor/kreuzberg/src/core/batch_optimizations.rs +0 -385
- data/vendor/kreuzberg/src/core/config_validation.rs +0 -949
- data/vendor/kreuzberg/src/core/formats.rs +0 -235
- data/vendor/kreuzberg/src/core/server_config.rs +0 -1220
- data/vendor/kreuzberg/src/extraction/capacity.rs +0 -263
- data/vendor/kreuzberg/src/extraction/markdown.rs +0 -216
- data/vendor/kreuzberg/src/extraction/office_metadata/odt_properties.rs +0 -284
- data/vendor/kreuzberg/src/extractors/bibtex.rs +0 -470
- data/vendor/kreuzberg/src/extractors/docbook.rs +0 -504
- data/vendor/kreuzberg/src/extractors/epub.rs +0 -696
- data/vendor/kreuzberg/src/extractors/fictionbook.rs +0 -492
- data/vendor/kreuzberg/src/extractors/jats.rs +0 -1054
- data/vendor/kreuzberg/src/extractors/jupyter.rs +0 -368
- data/vendor/kreuzberg/src/extractors/latex.rs +0 -653
- data/vendor/kreuzberg/src/extractors/markdown.rs +0 -701
- data/vendor/kreuzberg/src/extractors/odt.rs +0 -628
- data/vendor/kreuzberg/src/extractors/opml.rs +0 -635
- data/vendor/kreuzberg/src/extractors/orgmode.rs +0 -529
- data/vendor/kreuzberg/src/extractors/rst.rs +0 -577
- data/vendor/kreuzberg/src/extractors/rtf.rs +0 -809
- data/vendor/kreuzberg/src/extractors/security.rs +0 -484
- data/vendor/kreuzberg/src/extractors/security_tests.rs +0 -367
- data/vendor/kreuzberg/src/extractors/typst.rs +0 -651
- data/vendor/kreuzberg/src/language_detection/processor.rs +0 -218
- data/vendor/kreuzberg/src/ocr/language_registry.rs +0 -520
- data/vendor/kreuzberg/src/panic_context.rs +0 -154
- data/vendor/kreuzberg/src/pdf/bindings.rs +0 -306
- data/vendor/kreuzberg/src/pdf/bundled.rs +0 -408
- data/vendor/kreuzberg/src/pdf/fonts.rs +0 -358
- data/vendor/kreuzberg/src/pdf/hierarchy.rs +0 -903
- data/vendor/kreuzberg/src/text/quality_processor.rs +0 -231
- data/vendor/kreuzberg/src/text/utf8_validation.rs +0 -193
- data/vendor/kreuzberg/src/utils/pool.rs +0 -503
- data/vendor/kreuzberg/src/utils/pool_sizing.rs +0 -364
- data/vendor/kreuzberg/src/utils/string_pool.rs +0 -761
- data/vendor/kreuzberg/tests/api_embed.rs +0 -360
- data/vendor/kreuzberg/tests/api_extract_multipart.rs +0 -52
- data/vendor/kreuzberg/tests/api_large_pdf_extraction.rs +0 -471
- data/vendor/kreuzberg/tests/api_large_pdf_extraction_diagnostics.rs +0 -289
- data/vendor/kreuzberg/tests/batch_pooling_benchmark.rs +0 -154
- data/vendor/kreuzberg/tests/bibtex_parity_test.rs +0 -421
- data/vendor/kreuzberg/tests/config_integration_test.rs +0 -753
- data/vendor/kreuzberg/tests/data/hierarchy_ground_truth.json +0 -294
- data/vendor/kreuzberg/tests/docbook_extractor_tests.rs +0 -500
- data/vendor/kreuzberg/tests/docx_vs_pandoc_comparison.rs +0 -370
- data/vendor/kreuzberg/tests/epub_native_extractor_tests.rs +0 -275
- data/vendor/kreuzberg/tests/fictionbook_extractor_tests.rs +0 -228
- data/vendor/kreuzberg/tests/html_table_test.rs +0 -551
- data/vendor/kreuzberg/tests/instrumentation_test.rs +0 -139
- data/vendor/kreuzberg/tests/jats_extractor_tests.rs +0 -639
- data/vendor/kreuzberg/tests/jupyter_extractor_tests.rs +0 -704
- data/vendor/kreuzberg/tests/latex_extractor_tests.rs +0 -496
- data/vendor/kreuzberg/tests/markdown_extractor_tests.rs +0 -490
- data/vendor/kreuzberg/tests/ocr_language_registry.rs +0 -191
- data/vendor/kreuzberg/tests/odt_extractor_tests.rs +0 -674
- data/vendor/kreuzberg/tests/opml_extractor_tests.rs +0 -616
- data/vendor/kreuzberg/tests/orgmode_extractor_tests.rs +0 -822
- data/vendor/kreuzberg/tests/page_markers.rs +0 -297
- data/vendor/kreuzberg/tests/pdf_hierarchy_detection.rs +0 -301
- data/vendor/kreuzberg/tests/pdf_hierarchy_quality.rs +0 -589
- data/vendor/kreuzberg/tests/pdf_ocr_triggering.rs +0 -301
- data/vendor/kreuzberg/tests/pdf_text_merging.rs +0 -475
- data/vendor/kreuzberg/tests/pdfium_linking.rs +0 -340
- data/vendor/kreuzberg/tests/rst_extractor_tests.rs +0 -694
- data/vendor/kreuzberg/tests/rtf_extractor_tests.rs +0 -775
- data/vendor/kreuzberg/tests/typst_behavioral_tests.rs +0 -1260
- data/vendor/kreuzberg/tests/typst_extractor_tests.rs +0 -648
- data/vendor/kreuzberg-ffi/Cargo.toml +0 -67
- data/vendor/kreuzberg-ffi/README.md +0 -851
- data/vendor/kreuzberg-ffi/benches/result_view_benchmark.rs +0 -227
- data/vendor/kreuzberg-ffi/build.rs +0 -168
- data/vendor/kreuzberg-ffi/cbindgen.toml +0 -37
- data/vendor/kreuzberg-ffi/kreuzberg-ffi.pc.in +0 -12
- data/vendor/kreuzberg-ffi/kreuzberg.h +0 -3012
- data/vendor/kreuzberg-ffi/src/batch_streaming.rs +0 -588
- data/vendor/kreuzberg-ffi/src/config.rs +0 -1341
- data/vendor/kreuzberg-ffi/src/error.rs +0 -901
- data/vendor/kreuzberg-ffi/src/extraction.rs +0 -555
- data/vendor/kreuzberg-ffi/src/helpers.rs +0 -879
- data/vendor/kreuzberg-ffi/src/lib.rs +0 -977
- data/vendor/kreuzberg-ffi/src/memory.rs +0 -493
- data/vendor/kreuzberg-ffi/src/mime.rs +0 -329
- data/vendor/kreuzberg-ffi/src/panic_shield.rs +0 -265
- data/vendor/kreuzberg-ffi/src/plugins/document_extractor.rs +0 -442
- data/vendor/kreuzberg-ffi/src/plugins/mod.rs +0 -14
- data/vendor/kreuzberg-ffi/src/plugins/ocr_backend.rs +0 -628
- data/vendor/kreuzberg-ffi/src/plugins/post_processor.rs +0 -438
- data/vendor/kreuzberg-ffi/src/plugins/validator.rs +0 -329
- data/vendor/kreuzberg-ffi/src/result.rs +0 -510
- data/vendor/kreuzberg-ffi/src/result_pool.rs +0 -639
- data/vendor/kreuzberg-ffi/src/result_view.rs +0 -773
- data/vendor/kreuzberg-ffi/src/string_intern.rs +0 -568
- data/vendor/kreuzberg-ffi/src/types.rs +0 -363
- data/vendor/kreuzberg-ffi/src/util.rs +0 -210
- data/vendor/kreuzberg-ffi/src/validation.rs +0 -848
- data/vendor/kreuzberg-ffi/tests.disabled/README.md +0 -48
- data/vendor/kreuzberg-ffi/tests.disabled/config_loading_tests.rs +0 -299
- data/vendor/kreuzberg-ffi/tests.disabled/config_tests.rs +0 -346
- data/vendor/kreuzberg-ffi/tests.disabled/extractor_tests.rs +0 -232
- data/vendor/kreuzberg-ffi/tests.disabled/plugin_registration_tests.rs +0 -470
- data/vendor/kreuzberg-tesseract/.commitlintrc.json +0 -13
- data/vendor/kreuzberg-tesseract/.crate-ignore +0 -2
- data/vendor/kreuzberg-tesseract/Cargo.lock +0 -2933
- data/vendor/kreuzberg-tesseract/Cargo.toml +0 -57
- data/vendor/kreuzberg-tesseract/LICENSE +0 -22
- data/vendor/kreuzberg-tesseract/README.md +0 -399
- data/vendor/kreuzberg-tesseract/build.rs +0 -1127
- data/vendor/kreuzberg-tesseract/patches/README.md +0 -71
- data/vendor/kreuzberg-tesseract/patches/tesseract.diff +0 -199
- data/vendor/kreuzberg-tesseract/src/api.rs +0 -1371
- data/vendor/kreuzberg-tesseract/src/choice_iterator.rs +0 -77
- data/vendor/kreuzberg-tesseract/src/enums.rs +0 -297
- data/vendor/kreuzberg-tesseract/src/error.rs +0 -81
- data/vendor/kreuzberg-tesseract/src/lib.rs +0 -145
- data/vendor/kreuzberg-tesseract/src/monitor.rs +0 -57
- data/vendor/kreuzberg-tesseract/src/mutable_iterator.rs +0 -197
- data/vendor/kreuzberg-tesseract/src/page_iterator.rs +0 -253
- data/vendor/kreuzberg-tesseract/src/result_iterator.rs +0 -286
- data/vendor/kreuzberg-tesseract/src/result_renderer.rs +0 -183
- data/vendor/kreuzberg-tesseract/tests/integration_test.rs +0 -211
|
@@ -1,510 +0,0 @@
|
|
|
1
|
-
//! Result accessor FFI module.
|
|
2
|
-
//!
|
|
3
|
-
//! Provides C-compatible functions to access fields from ExtractionResult without
|
|
4
|
-
//! requiring bindings to parse JSON. This eliminates JSON round-trips and allows
|
|
5
|
-
//! efficient field access in language bindings.
|
|
6
|
-
//!
|
|
7
|
-
//! All string-returning functions return pointers to C strings that MUST be freed
|
|
8
|
-
//! with `kreuzberg_free_string()`.
|
|
9
|
-
|
|
10
|
-
use crate::{clear_last_error, set_last_error};
|
|
11
|
-
use kreuzberg::types::ExtractionResult;
|
|
12
|
-
use std::ffi::CString;
|
|
13
|
-
use std::os::raw::c_char;
|
|
14
|
-
use std::ptr;
|
|
15
|
-
|
|
16
|
-
/// Get page count from extraction result.
|
|
17
|
-
///
|
|
18
|
-
/// Returns the total number of pages/slides/sheets detected in the document.
|
|
19
|
-
///
|
|
20
|
-
/// # Arguments
|
|
21
|
-
///
|
|
22
|
-
/// * `result` - Pointer to an ExtractionResult structure
|
|
23
|
-
///
|
|
24
|
-
/// # Returns
|
|
25
|
-
///
|
|
26
|
-
/// The page count (>= 0) if successful, or -1 on error (check `kreuzberg_last_error`).
|
|
27
|
-
///
|
|
28
|
-
/// # Safety
|
|
29
|
-
///
|
|
30
|
-
/// - `result` must be a valid pointer to an ExtractionResult
|
|
31
|
-
/// - `result` cannot be NULL
|
|
32
|
-
///
|
|
33
|
-
/// # Example (C)
|
|
34
|
-
///
|
|
35
|
-
/// ```c
|
|
36
|
-
/// ExtractionResult* result = kreuzberg_extract_file("document.pdf", NULL);
|
|
37
|
-
/// if (result != NULL) {
|
|
38
|
-
/// int page_count = kreuzberg_result_get_page_count(result);
|
|
39
|
-
/// if (page_count >= 0) {
|
|
40
|
-
/// printf("Document has %d pages\n", page_count);
|
|
41
|
-
/// }
|
|
42
|
-
/// kreuzberg_result_free(result);
|
|
43
|
-
/// }
|
|
44
|
-
/// ```
|
|
45
|
-
#[unsafe(no_mangle)]
|
|
46
|
-
pub unsafe extern "C" fn kreuzberg_result_get_page_count(result: *const ExtractionResult) -> i32 {
|
|
47
|
-
if result.is_null() {
|
|
48
|
-
set_last_error("Result cannot be NULL".to_string());
|
|
49
|
-
return -1;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
clear_last_error();
|
|
53
|
-
|
|
54
|
-
let result_ref = unsafe { &*result };
|
|
55
|
-
|
|
56
|
-
if let Some(metadata) = &result_ref.metadata.pages {
|
|
57
|
-
metadata.total_count as i32
|
|
58
|
-
} else {
|
|
59
|
-
0
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/// Get chunk count from extraction result.
|
|
64
|
-
///
|
|
65
|
-
/// Returns the number of text chunks when chunking is enabled, or 0 if chunking
|
|
66
|
-
/// was not performed.
|
|
67
|
-
///
|
|
68
|
-
/// # Arguments
|
|
69
|
-
///
|
|
70
|
-
/// * `result` - Pointer to an ExtractionResult structure
|
|
71
|
-
///
|
|
72
|
-
/// # Returns
|
|
73
|
-
///
|
|
74
|
-
/// The chunk count (>= 0) if successful, or -1 on error (check `kreuzberg_last_error`).
|
|
75
|
-
///
|
|
76
|
-
/// # Safety
|
|
77
|
-
///
|
|
78
|
-
/// - `result` must be a valid pointer to an ExtractionResult
|
|
79
|
-
/// - `result` cannot be NULL
|
|
80
|
-
///
|
|
81
|
-
/// # Example (C)
|
|
82
|
-
///
|
|
83
|
-
/// ```c
|
|
84
|
-
/// ExtractionResult* result = kreuzberg_extract_file("document.pdf", config);
|
|
85
|
-
/// if (result != NULL) {
|
|
86
|
-
/// int chunk_count = kreuzberg_result_get_chunk_count(result);
|
|
87
|
-
/// if (chunk_count >= 0) {
|
|
88
|
-
/// printf("Document has %d chunks\n", chunk_count);
|
|
89
|
-
/// }
|
|
90
|
-
/// kreuzberg_result_free(result);
|
|
91
|
-
/// }
|
|
92
|
-
/// ```
|
|
93
|
-
#[unsafe(no_mangle)]
|
|
94
|
-
pub unsafe extern "C" fn kreuzberg_result_get_chunk_count(result: *const ExtractionResult) -> i32 {
|
|
95
|
-
if result.is_null() {
|
|
96
|
-
set_last_error("Result cannot be NULL".to_string());
|
|
97
|
-
return -1;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
clear_last_error();
|
|
101
|
-
|
|
102
|
-
let result_ref = unsafe { &*result };
|
|
103
|
-
|
|
104
|
-
if let Some(chunks) = &result_ref.chunks {
|
|
105
|
-
chunks.len() as i32
|
|
106
|
-
} else {
|
|
107
|
-
0
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/// Get detected language from extraction result.
|
|
112
|
-
///
|
|
113
|
-
/// Returns the primary detected language as an ISO 639 language code.
|
|
114
|
-
/// If multiple languages were detected, returns the primary one.
|
|
115
|
-
///
|
|
116
|
-
/// # Arguments
|
|
117
|
-
///
|
|
118
|
-
/// * `result` - Pointer to an ExtractionResult structure
|
|
119
|
-
///
|
|
120
|
-
/// # Returns
|
|
121
|
-
///
|
|
122
|
-
/// A pointer to a C string containing the language code (e.g., "en", "de"),
|
|
123
|
-
/// or NULL if no language was detected or on error (check `kreuzberg_last_error`).
|
|
124
|
-
///
|
|
125
|
-
/// The returned pointer must be freed with `kreuzberg_free_string()`.
|
|
126
|
-
///
|
|
127
|
-
/// # Safety
|
|
128
|
-
///
|
|
129
|
-
/// - `result` must be a valid pointer to an ExtractionResult
|
|
130
|
-
/// - `result` cannot be NULL
|
|
131
|
-
/// - The returned pointer (if non-NULL) must be freed with `kreuzberg_free_string`
|
|
132
|
-
///
|
|
133
|
-
/// # Example (C)
|
|
134
|
-
///
|
|
135
|
-
/// ```c
|
|
136
|
-
/// ExtractionResult* result = kreuzberg_extract_file("document.pdf", NULL);
|
|
137
|
-
/// if (result != NULL) {
|
|
138
|
-
/// char* language = kreuzberg_result_get_detected_language(result);
|
|
139
|
-
/// if (language != NULL) {
|
|
140
|
-
/// printf("Detected language: %s\n", language);
|
|
141
|
-
/// kreuzberg_free_string(language);
|
|
142
|
-
/// }
|
|
143
|
-
/// kreuzberg_result_free(result);
|
|
144
|
-
/// }
|
|
145
|
-
/// ```
|
|
146
|
-
#[unsafe(no_mangle)]
|
|
147
|
-
pub unsafe extern "C" fn kreuzberg_result_get_detected_language(result: *const ExtractionResult) -> *mut c_char {
|
|
148
|
-
if result.is_null() {
|
|
149
|
-
set_last_error("Result cannot be NULL".to_string());
|
|
150
|
-
return ptr::null_mut();
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
clear_last_error();
|
|
154
|
-
|
|
155
|
-
let result_ref = unsafe { &*result };
|
|
156
|
-
|
|
157
|
-
let language = if let Some(lang) = &result_ref.metadata.language {
|
|
158
|
-
lang.clone()
|
|
159
|
-
} else if let Some(langs) = &result_ref.detected_languages {
|
|
160
|
-
if !langs.is_empty() {
|
|
161
|
-
langs[0].clone()
|
|
162
|
-
} else {
|
|
163
|
-
set_last_error("No language detected".to_string());
|
|
164
|
-
return ptr::null_mut();
|
|
165
|
-
}
|
|
166
|
-
} else {
|
|
167
|
-
set_last_error("No language detected".to_string());
|
|
168
|
-
return ptr::null_mut();
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
match CString::new(language) {
|
|
172
|
-
Ok(c_string) => c_string.into_raw(),
|
|
173
|
-
Err(e) => {
|
|
174
|
-
set_last_error(format!("Failed to convert language to C string: {}", e));
|
|
175
|
-
ptr::null_mut()
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/// Metadata field accessor structure
|
|
181
|
-
///
|
|
182
|
-
/// Returned by `kreuzberg_result_get_metadata_field()`. Contains the field value
|
|
183
|
-
/// as JSON and information about whether the field exists.
|
|
184
|
-
///
|
|
185
|
-
/// # Fields
|
|
186
|
-
///
|
|
187
|
-
/// * `name` - The field name requested (does not need to be freed)
|
|
188
|
-
/// * `json_value` - JSON representation of the field value, or NULL if field doesn't exist
|
|
189
|
-
/// * `is_null` - 1 if the field doesn't exist, 0 if it does
|
|
190
|
-
///
|
|
191
|
-
/// The `json_value` pointer (if non-NULL) must be freed with `kreuzberg_free_string()`.
|
|
192
|
-
#[repr(C)]
|
|
193
|
-
pub struct CMetadataField {
|
|
194
|
-
pub name: *const c_char,
|
|
195
|
-
pub json_value: *mut c_char,
|
|
196
|
-
pub is_null: i32,
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/// Get a metadata field by name.
|
|
200
|
-
///
|
|
201
|
-
/// Retrieves a metadata field from the extraction result and returns its value
|
|
202
|
-
/// as a JSON string. Supports nested fields with dot notation (e.g., "format.pages").
|
|
203
|
-
///
|
|
204
|
-
/// # Arguments
|
|
205
|
-
///
|
|
206
|
-
/// * `result` - Pointer to an ExtractionResult structure
|
|
207
|
-
/// * `field_name` - Null-terminated C string with the field name
|
|
208
|
-
///
|
|
209
|
-
/// # Returns
|
|
210
|
-
///
|
|
211
|
-
/// A CMetadataField structure containing:
|
|
212
|
-
/// - `name`: The field name (caller should not free)
|
|
213
|
-
/// - `json_value`: Pointer to field value as JSON string (must free with `kreuzberg_free_string`),
|
|
214
|
-
/// or NULL if field doesn't exist
|
|
215
|
-
/// - `is_null`: 1 if field doesn't exist, 0 if it does
|
|
216
|
-
///
|
|
217
|
-
/// # Safety
|
|
218
|
-
///
|
|
219
|
-
/// - `result` must be a valid pointer to an ExtractionResult
|
|
220
|
-
/// - `field_name` must be a valid null-terminated C string
|
|
221
|
-
/// - Neither parameter can be NULL
|
|
222
|
-
/// - The returned `json_value` (if non-NULL) must be freed with `kreuzberg_free_string`
|
|
223
|
-
///
|
|
224
|
-
/// # Example (C)
|
|
225
|
-
///
|
|
226
|
-
/// ```c
|
|
227
|
-
/// ExtractionResult* result = kreuzberg_extract_file("document.pdf", NULL);
|
|
228
|
-
/// if (result != NULL) {
|
|
229
|
-
/// CMetadataField title_field = kreuzberg_result_get_metadata_field(result, "title");
|
|
230
|
-
/// if (!title_field.is_null) {
|
|
231
|
-
/// printf("Title: %s\n", title_field.json_value);
|
|
232
|
-
/// kreuzberg_free_string(title_field.json_value);
|
|
233
|
-
/// }
|
|
234
|
-
///
|
|
235
|
-
/// CMetadataField author_field = kreuzberg_result_get_metadata_field(result, "authors");
|
|
236
|
-
/// if (!author_field.is_null) {
|
|
237
|
-
/// printf("Authors: %s\n", author_field.json_value);
|
|
238
|
-
/// kreuzberg_free_string(author_field.json_value);
|
|
239
|
-
/// }
|
|
240
|
-
///
|
|
241
|
-
/// kreuzberg_result_free(result);
|
|
242
|
-
/// }
|
|
243
|
-
/// ```
|
|
244
|
-
#[unsafe(no_mangle)]
|
|
245
|
-
pub unsafe extern "C" fn kreuzberg_result_get_metadata_field(
|
|
246
|
-
result: *const ExtractionResult,
|
|
247
|
-
field_name: *const c_char,
|
|
248
|
-
) -> CMetadataField {
|
|
249
|
-
if result.is_null() {
|
|
250
|
-
set_last_error("Result cannot be NULL".to_string());
|
|
251
|
-
return CMetadataField {
|
|
252
|
-
name: field_name,
|
|
253
|
-
json_value: ptr::null_mut(),
|
|
254
|
-
is_null: 1,
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
if field_name.is_null() {
|
|
259
|
-
set_last_error("Field name cannot be NULL".to_string());
|
|
260
|
-
return CMetadataField {
|
|
261
|
-
name: ptr::null(),
|
|
262
|
-
json_value: ptr::null_mut(),
|
|
263
|
-
is_null: 1,
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
clear_last_error();
|
|
268
|
-
|
|
269
|
-
let field_str = match unsafe { std::ffi::CStr::from_ptr(field_name) }.to_str() {
|
|
270
|
-
Ok(s) => s,
|
|
271
|
-
Err(e) => {
|
|
272
|
-
set_last_error(format!("Invalid UTF-8 in field name: {}", e));
|
|
273
|
-
return CMetadataField {
|
|
274
|
-
name: field_name,
|
|
275
|
-
json_value: ptr::null_mut(),
|
|
276
|
-
is_null: 1,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
let result_ref = unsafe { &*result };
|
|
282
|
-
|
|
283
|
-
let metadata_json = match serde_json::to_value(&result_ref.metadata) {
|
|
284
|
-
Ok(val) => val,
|
|
285
|
-
Err(e) => {
|
|
286
|
-
set_last_error(format!("Failed to serialize metadata: {}", e));
|
|
287
|
-
return CMetadataField {
|
|
288
|
-
name: field_name,
|
|
289
|
-
json_value: ptr::null_mut(),
|
|
290
|
-
is_null: 1,
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
let mut current = &metadata_json;
|
|
296
|
-
for part in field_str.split('.') {
|
|
297
|
-
if let Some(obj) = current.as_object() {
|
|
298
|
-
match obj.get(part) {
|
|
299
|
-
Some(val) => current = val,
|
|
300
|
-
None => {
|
|
301
|
-
return CMetadataField {
|
|
302
|
-
name: field_name,
|
|
303
|
-
json_value: ptr::null_mut(),
|
|
304
|
-
is_null: 1,
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
} else {
|
|
309
|
-
return CMetadataField {
|
|
310
|
-
name: field_name,
|
|
311
|
-
json_value: ptr::null_mut(),
|
|
312
|
-
is_null: 1,
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
match serde_json::to_string(current) {
|
|
318
|
-
Ok(json) => match CString::new(json) {
|
|
319
|
-
Ok(c_string) => CMetadataField {
|
|
320
|
-
name: field_name,
|
|
321
|
-
json_value: c_string.into_raw(),
|
|
322
|
-
is_null: 0,
|
|
323
|
-
},
|
|
324
|
-
Err(e) => {
|
|
325
|
-
set_last_error(format!("Failed to convert field value to C string: {}", e));
|
|
326
|
-
CMetadataField {
|
|
327
|
-
name: field_name,
|
|
328
|
-
json_value: ptr::null_mut(),
|
|
329
|
-
is_null: 1,
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
},
|
|
333
|
-
Err(e) => {
|
|
334
|
-
set_last_error(format!("Failed to serialize field value: {}", e));
|
|
335
|
-
CMetadataField {
|
|
336
|
-
name: field_name,
|
|
337
|
-
json_value: ptr::null_mut(),
|
|
338
|
-
is_null: 1,
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
#[cfg(test)]
|
|
345
|
-
mod tests {
|
|
346
|
-
use super::*;
|
|
347
|
-
use std::ffi::CStr;
|
|
348
|
-
|
|
349
|
-
fn create_test_result() -> ExtractionResult {
|
|
350
|
-
use kreuzberg::types::{Metadata, PageStructure, PageUnitType};
|
|
351
|
-
|
|
352
|
-
let mut metadata = Metadata {
|
|
353
|
-
title: Some("Test Document".to_string()),
|
|
354
|
-
language: Some("en".to_string()),
|
|
355
|
-
..Default::default()
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
let page_structure = PageStructure {
|
|
359
|
-
total_count: 10,
|
|
360
|
-
unit_type: PageUnitType::Page,
|
|
361
|
-
boundaries: None,
|
|
362
|
-
pages: None,
|
|
363
|
-
};
|
|
364
|
-
metadata.pages = Some(page_structure);
|
|
365
|
-
|
|
366
|
-
ExtractionResult {
|
|
367
|
-
content: "Sample content for testing".to_string(),
|
|
368
|
-
mime_type: "text/plain".to_string(),
|
|
369
|
-
metadata,
|
|
370
|
-
tables: vec![],
|
|
371
|
-
detected_languages: Some(vec!["en".to_string(), "de".to_string()]),
|
|
372
|
-
chunks: Some(vec![
|
|
373
|
-
kreuzberg::types::Chunk {
|
|
374
|
-
content: "Chunk 1".to_string(),
|
|
375
|
-
embedding: None,
|
|
376
|
-
metadata: kreuzberg::types::ChunkMetadata {
|
|
377
|
-
byte_start: 0,
|
|
378
|
-
byte_end: 7,
|
|
379
|
-
token_count: None,
|
|
380
|
-
chunk_index: 0,
|
|
381
|
-
total_chunks: 2,
|
|
382
|
-
first_page: None,
|
|
383
|
-
last_page: None,
|
|
384
|
-
},
|
|
385
|
-
},
|
|
386
|
-
kreuzberg::types::Chunk {
|
|
387
|
-
content: "Chunk 2".to_string(),
|
|
388
|
-
embedding: None,
|
|
389
|
-
metadata: kreuzberg::types::ChunkMetadata {
|
|
390
|
-
byte_start: 8,
|
|
391
|
-
byte_end: 15,
|
|
392
|
-
token_count: None,
|
|
393
|
-
chunk_index: 1,
|
|
394
|
-
total_chunks: 2,
|
|
395
|
-
first_page: None,
|
|
396
|
-
last_page: None,
|
|
397
|
-
},
|
|
398
|
-
},
|
|
399
|
-
]),
|
|
400
|
-
images: None,
|
|
401
|
-
pages: None,
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
#[test]
|
|
406
|
-
fn test_result_get_page_count() {
|
|
407
|
-
let result = create_test_result();
|
|
408
|
-
let result_ptr = Box::into_raw(Box::new(result));
|
|
409
|
-
|
|
410
|
-
let page_count = unsafe { kreuzberg_result_get_page_count(result_ptr) };
|
|
411
|
-
assert_eq!(page_count, 10);
|
|
412
|
-
|
|
413
|
-
unsafe {
|
|
414
|
-
let _ = Box::from_raw(result_ptr);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
#[test]
|
|
419
|
-
fn test_result_get_page_count_null() {
|
|
420
|
-
let page_count = unsafe { kreuzberg_result_get_page_count(ptr::null()) };
|
|
421
|
-
assert_eq!(page_count, -1);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
#[test]
|
|
425
|
-
fn test_result_get_chunk_count() {
|
|
426
|
-
let result = create_test_result();
|
|
427
|
-
let result_ptr = Box::into_raw(Box::new(result));
|
|
428
|
-
|
|
429
|
-
let chunk_count = unsafe { kreuzberg_result_get_chunk_count(result_ptr) };
|
|
430
|
-
assert_eq!(chunk_count, 2);
|
|
431
|
-
|
|
432
|
-
unsafe {
|
|
433
|
-
let _ = Box::from_raw(result_ptr);
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
#[test]
|
|
438
|
-
fn test_result_get_chunk_count_null() {
|
|
439
|
-
let chunk_count = unsafe { kreuzberg_result_get_chunk_count(ptr::null()) };
|
|
440
|
-
assert_eq!(chunk_count, -1);
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
#[test]
|
|
444
|
-
fn test_result_get_detected_language() {
|
|
445
|
-
let result = create_test_result();
|
|
446
|
-
let result_ptr = Box::into_raw(Box::new(result));
|
|
447
|
-
|
|
448
|
-
let lang_ptr = unsafe { kreuzberg_result_get_detected_language(result_ptr) };
|
|
449
|
-
assert!(!lang_ptr.is_null());
|
|
450
|
-
|
|
451
|
-
let lang_str = unsafe { CStr::from_ptr(lang_ptr).to_str().unwrap() };
|
|
452
|
-
assert_eq!(lang_str, "en");
|
|
453
|
-
|
|
454
|
-
unsafe {
|
|
455
|
-
crate::kreuzberg_free_string(lang_ptr);
|
|
456
|
-
let _ = Box::from_raw(result_ptr);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
#[test]
|
|
461
|
-
fn test_result_get_detected_language_null() {
|
|
462
|
-
let lang_ptr = unsafe { kreuzberg_result_get_detected_language(ptr::null()) };
|
|
463
|
-
assert!(lang_ptr.is_null());
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
#[test]
|
|
467
|
-
fn test_result_get_metadata_field_title() {
|
|
468
|
-
let result = create_test_result();
|
|
469
|
-
let result_ptr = Box::into_raw(Box::new(result));
|
|
470
|
-
|
|
471
|
-
let field_name = std::ffi::CString::new("title").unwrap();
|
|
472
|
-
let field = unsafe { kreuzberg_result_get_metadata_field(result_ptr, field_name.as_ptr()) };
|
|
473
|
-
|
|
474
|
-
assert_eq!(field.is_null, 0);
|
|
475
|
-
assert!(!field.json_value.is_null());
|
|
476
|
-
|
|
477
|
-
let value_str = unsafe { CStr::from_ptr(field.json_value).to_str().unwrap() };
|
|
478
|
-
assert_eq!(value_str, r#""Test Document""#);
|
|
479
|
-
|
|
480
|
-
unsafe {
|
|
481
|
-
crate::kreuzberg_free_string(field.json_value);
|
|
482
|
-
let _ = Box::from_raw(result_ptr);
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
#[test]
|
|
487
|
-
fn test_result_get_metadata_field_missing() {
|
|
488
|
-
let result = create_test_result();
|
|
489
|
-
let result_ptr = Box::into_raw(Box::new(result));
|
|
490
|
-
|
|
491
|
-
let field_name = std::ffi::CString::new("nonexistent").unwrap();
|
|
492
|
-
let field = unsafe { kreuzberg_result_get_metadata_field(result_ptr, field_name.as_ptr()) };
|
|
493
|
-
|
|
494
|
-
assert_eq!(field.is_null, 1);
|
|
495
|
-
assert!(field.json_value.is_null());
|
|
496
|
-
|
|
497
|
-
unsafe {
|
|
498
|
-
let _ = Box::from_raw(result_ptr);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
#[test]
|
|
503
|
-
fn test_result_get_metadata_field_null_result() {
|
|
504
|
-
let field_name = std::ffi::CString::new("title").unwrap();
|
|
505
|
-
let field = unsafe { kreuzberg_result_get_metadata_field(ptr::null(), field_name.as_ptr()) };
|
|
506
|
-
|
|
507
|
-
assert_eq!(field.is_null, 1);
|
|
508
|
-
assert!(field.json_value.is_null());
|
|
509
|
-
}
|
|
510
|
-
}
|