首页/新闻资讯/正文详情

在 Xberg Dart 绑定中查询验证器插件注册表:listValidators 用法与底层原理

发布时间:2026/9/28 2:55:01 来源:云帆数科 栏目:资讯中心
在 Xberg Dart 绑定中查询验证器插件注册表:listValidators 用法与底层原理
后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本篇技术指南以 Xberg 仓库自动生成的 Dart 测试片段 list_validators.md 为主线讲解如何通过 Dart 绑定调用XbergBridge.listValidators()列出当前已注册的验证器Validator插件并结合 Rust 核心源码剖析验证器注册表的内部结构、生命周期管理与优先级机制。读完本文你将掌握在 Dart/Flutter 项目中查询、注册、注销与清空验证器插件的完整套路并理解这些 API 在 Rust 侧的真实实现路径。一、验证器Validator插件是什么在 Xberg 的插件体系里验证器是一种「硬性检查」插件它针对一次文档提取得到的ExtractedDocument结果做质量、完整性或合规性校验一旦校验失败整次提取立即失败并向上层抛出错误。Rust 侧对Validatortrait 的定义位于 crates/xberg/src/plugins/validator/trait.rs其文档明确给出了典型使用场景质量闸门Quality Gates确保提取内容满足最低质量要求合规检查Compliance验证内容满足监管或业务要求内容过滤Content Filtering拒绝包含违禁内容的文档格式校验Format Validation验证提取结果的结构安全检查Security Checks扫描恶意内容。关键语义是验证器的错误是致命的会向上冒泡导致提取失败如果是非致命检查应当使用后处理器Post-Processor而非验证器。验证器必须满足线程安全Send Sync。二、核心用法用 Dart 列出所有已注册验证器原文档给出了一个可直接运行的完整 Dart 程序它初始化 Rust 运行时、调用listValidators、打印结果并释放资源import dart:io; import package:xberg/xberg.dart; import package:xberg/src/xberg_bridge_generated/frb_generated.dart show RustLib; Futurevoid main() async { await RustLib.init(); try { final result await XbergBridge.listValidators(); stdout.writeln(result); } finally { RustLib.dispose(); } }逐步拆解这段代码await RustLib.init()flutter_rust_bridgefrb生成的运行时初始化。RustLib来自frb_generated.dart所有通过XbergBridge发起的 Rust 调用都依赖它先行启动。await XbergBridge.listValidators()XbergBridge是 Dart 侧的静态门面类定义在 packages/dart/lib/src/xberg.dartalef 生成勿手改。该方法经 FFI 桥接到 Rust 侧list_validators返回当前注册表中全部验证器的名称列表。stdout.writeln(result)将名称列表打印到标准输出便于在测试或命令行场景直接观察。finally { RustLib.dispose(); }无论调用成功与否都在退出前释放 Rust 运行时资源避免泄漏。这是所有 Dart 绑定的标准收尾写法。需要说明的是该片段是 alef 为 e2e 测试自动生成的 fixture头部 frontmatter 标记了side_effect: safe纯读操作、无副作用与requires: []无需预置依赖因此可以直接在测试环境中安全执行。三、底层实现从 Dart 桥接到 Rust 全局注册表listValidators并不是一个孤立函数它的真实执行路径如下Dart 侧调用XbergBridge.listValidators()经 frb 生成的桥接层packages/dart/lib/src/xberg_bridge_generated/frb_generated.dart转发到 Rust。Rust 侧入口是 crates/xberg/src/plugins/validator/mod.rs 中的list_validators()pub fn list_validators() - crate::ResultVecString { use crate::plugins::registry::get_validator_registry; let registry get_validator_registry(); let registry registry.read(); Ok(registry.list()) }get_validator_registry()返回的正是全局单例VALIDATOR_REGISTRY定义在 crates/xberg/src/plugins/registry/mod.rspub static VALIDATOR_REGISTRY: LazyLockArcRwLockValidatorRegistry LazyLock::new(|| Arc::new(RwLock::new(ValidatorRegistry::new())));它用RwLock包装支持多线程并发读写读取时拿read()锁注册/注销时拿write()锁。最终落到ValidatorRegistry::list()实现在 crates/xberg/src/plugins/registry/validator.rspub fn list(self) - VecString { let mut names std::collections::HashSet::new(); for validators in self.validators.values() { names.extend(validators.keys().cloned()); } names.into_iter().collect() }这里值得注意的实现细节注册表内部用BTreeMapi32, IndexMapString, Arcdyn Validator组织外层以优先级i32为键、内层以插件名为键而list()收集名字时使用的是HashSet因此返回的名称列表不保证有序。如果你的 Dart 业务代码需要对名称排序展示应自行sort()不能依赖返回顺序。四、验证器注册表的完整管理 APIlistValidators只是注册表管理面的一角。同一模块还提供了配套的三个操作全部在 crates/xberg/src/plugins/validator/mod.rs 中定义并经 crates/xberg/src/plugins/mod.rs 的pub use统一导出函数作用锁register_validator(Arcdyn Validator)注册验证器调用其initialize()后按优先级插入写锁unregister_validator(name: str)按名称移除并调用其shutdown()释放资源写锁clear_validators()逐个注销并清空全部验证器写锁list_validators()返回所有已注册验证器的名称列表读锁注册时的两道防线见ValidatorRegistry::register名称校验validate_plugin_namecrates/xberg/src/plugins/registry/mod.rs要求名称非空、不含空白字符并建议遵循 kebab-case 惯例。空的或含空格的名字会直接返回Validation错误并被拒绝注册——对应测试test_validator_registry_invalid_name_empty/test_validator_registry_invalid_name_whitespace。初始化校验注册时会先调用validator.initialize()初始化失败则注册中止保证注册表里不存在半初始化的插件。注销时的资源回收remove使用IndexMap::shift_remove找到目标验证器并调用其shutdown()若shutdown失败会返回错误并记录告警日志但注册表仍会清理该条目。在 Dart 侧这四个能力都有对应桥接方法registerValidator/unregisterValidator/clearValidators/listValidators并且仓库的 e2e 测试给出了完整调用样例见 e2e/dart/test/plugin_api_test.dart注册→注销流程与 e2e/dart/test/validator_management_test.dart清空后列表为空、列出全部已注册验证器。五、编写自定义验证器的关键点要注册一个验证器需要实现Plugin与Validator两个 trait。Validatortrait 在 crates/xberg/src/plugins/validator/trait.rs 中定义了三个方法方法默认值说明validate(result, config) - Result()必须实现校验提取结果返回Err即整体提取失败should_validate(result, config) - booltrue始终执行条件化开关可按 MIME 类型等决定是否运行priority() - i3250优先级数值越大越先执行一个内容最短长度校验器的最小实现来自 trait 文档示例use xberg::plugins::{Plugin, Validator}; use xberg::{Result, ExtractedDocument, ExtractionConfig, XbergError}; use async_trait::async_trait; struct MinimumLengthValidator { min_length: usize, } impl Plugin for MinimumLengthValidator { fn name(self) - str { min-length-validator } fn version(self) - String { 1.0.0.to_string() } fn initialize(self) - Result() { Ok(()) } fn shutdown(self) - Result() { Ok(()) } } #[async_trait] impl Validator for MinimumLengthValidator { async fn validate(self, result: ExtractedDocument, config: ExtractionConfig) - Result() { if result.content.len() self.min_length { return Err(XbergError::validation(format!( Content too short: {} {} characters, result.content.len(), self.min_length ))); } Ok(()) } }关于优先级与条件执行的几个由源码测试确认的行为优先级排序注册表get_all()按优先级降序遍历BTreeMapiter().rev()测试test_validator_registry与test_validator_priority_ordering_reversed验证了无论注册先后高优先级验证器总是排在前、先执行。同优先级共存同一优先级下允许多个验证器共存test_validator_multiple_same_priority。条件跳过should_validate返回false时验证器被跳过。测试test_validator_should_validate_conditional中的PdfOnlyValidator只在 MIME 为application/pdf时执行校验。错误语义验证失败返回XbergError::Validation测试test_validator_failure与test_validator_error_message确认错误消息可精确断言。六、验证器相关的测试与 fixture仓库围绕验证器注册表提供了三层验证证据Rust 单元测试crates/xberg/src/plugins/registry/validator.rs 内含十余个测试覆盖注册/注销/清空、名称非法、初始化失败、优先级排序、同优先级共存、移除后再注册等场景crates/xberg/src/plugins/validator/mod.rs 的测试则覆盖成功/失败校验、空内容、带元数据、带表格、多种 MIME、超长内容等边界情况。Dart e2e 测试e2e/dart/test/registry_test.dart 中的List validators用例直接调用XbergBridge.listValidators()并断言结果e2e/dart/test/validator_management_test.dart 验证清空后列表为空、列出全部已注册验证器。契约 fixturefixtures/registry/list_validators.json 与 fixtures/plugin_api/validators_list.json 是跨语言契约测试的基准数据保证 Dart 之外的各语言绑定对列出验证器返回一致的结果fixtures/plugin_api/register_validator_trait_bridge.json 与 fixtures/plugin_api/unregister_validator_after_register.json 则锁定注册→注销的完整生命周期。七、运行前提与注意事项本文的 Dart 片段依赖package:xberg绑定需先按仓库说明构建 Dart 绑定包并在pubspec.yaml中引入RustLib.init()必须在任何XbergBridge调用之前完成。listValidators是只读操作fixture 标记side_effect: safe可以在测试中反复调用但注册、注销、清空会修改全局单例VALIDATOR_REGISTRY在多测试并发场景下需注意测试隔离。返回的名称列表基于HashSet收集顺序不保证依赖顺序的业务代码应自行排序。若列表为空说明当前进程内尚未注册任何验证器——这是合法的初始状态list()对空注册表返回空列表而非错误对应test_validator_shutdown_empty_registry。该 fixture 文档头部注明由 alef 自动生成alef e2e generate可重新生成alef verify可校验新鲜度如需修改契约内容应更新生成源而非手工编辑此文件。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐OpenProject开源项目管理从零到上线指南OpenProject开源项目管理从零到上线指南 OpenProject 是可自建部署的开源项目管理软件覆盖从立项、拆任务、甘特图排期到工时跟踪的完整流程。后端AI 应用NLP使用 C 绑定列出 Xberg 已注册验证器Validator 插件注册表实战指南使用 C 绑定列出 Xberg 已注册验证器Validator 插件注册表实战指南 导读 本文以 Xberg 开源仓库中的 C 绑定能力为核心讲解如何通过一后端AI 应用NLP终极游戏库革命5分钟学会用Playnite统一管理所有游戏平台终极游戏库革命5分钟学会用Playnite统一管理所有游戏平台 你是否曾经为了玩不同平台的游戏不得不在Steam、Epic、GOG、EA App、Battl后端AI 应用NLP上一篇微信数据安全警示从GoWxDump下架看个人信息保护的重要性下一篇Geolocator.js距离与ETA工具集秒算两点距离、旅行时长与时区信息的3种方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

NoneBot 钩子函数(Hook)完全指南:全局生命周期钩子与事件处理钩子实战详解
NoneBot 钩子函数(Hook)完全指南:全局生命周期钩子与事件处理钩子实战详解

后端即时通讯 【免费下载链接】nonebot2 跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python 项目地址: https://gitcode.com/gh_mirrors/no/nonebot2 点击查看 免费下载 本文基于 NoneBot(当前仓库… · 2026/9/28 2:55:01

基于CGH40010F的Doherty功放半理想架构ADS仿真流程详解
基于CGH40010F的Doherty功放半理想架构ADS仿真流程详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 2:55:01

HLS转RTL实战:OpenCV与TFLite模型在FPGA上的落地难点与优化策略
HLS转RTL实战:OpenCV与TFLite模型在FPGA上的落地难点与优化策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 2:55:01

顺义本土正骨名医——苏荫来的故事
顺义本土正骨名医——苏荫来的故事

在顺义本地骨伤正骨领域,有这样一位深耕三十余年的实力派老医者,一身古法正骨手艺,一手传承绝活,专治各类筋骨伤痛,凭借精准的手法、扎实的疗效、踏实的行医作风,深得邻里百姓信赖与认可。他就是杏园金方首… · 2026/9/28 3:29:27

2026实测百度网盘直链助手脚本,速度超越PanDownload工具
2026实测百度网盘直链助手脚本,速度超越PanDownload工具

随着我们手头的各种文档和视频资料越来越大,网盘在数据流转中扮演的角色也越来越重要。不管是工作交接还是备份生活点滴,它都帮了我们不少忙。 不过在日常使用中,偶尔遇到下载变慢也确实会让人感到有些苦恼。面对这种现象我们除了可以配合Pa… · 2026/9/28 3:29:08

剪映操作|输入文字后,能不能自动生成虚拟主播、配音和字幕
剪映操作|输入文字后,能不能自动生成虚拟主播、配音和字幕

适用对象:AI视频生成任务的创作者。本文只处理“输入文字后,能不能自动生成虚拟主播、配音和字幕?”这一件事。先确定这一条要解决什么先给结论:处理“输入文字后,能不能自动生成虚拟主播、配音和字幕?”&a… · 2026/9/28 3:28:21

运算符 文件操作 6
运算符 文件操作 6

运算符&#xff1a;算数运算: - * / % ////&#xff1a;整除%&#xff1a;求余比较运算&#xff1a;> < > < !赋值运算 &#xff1a; - *a21 b2 a,bb,a#只适合python print(a)#2 print(b)#21逻辑运算&#xff1a;and or not当and&#xff0c;or… · 2026/9/28 3:27:47

字符集和编码 bytes 5
字符集和编码 bytes 5

字符集和编码ascii——编排了128个文字字符&#xff0c;只需要7个0和1就可以表示了——1 byte8 bitANSI——每个字符 16 bit&#xff0c;2byteGBK编码Unicode&#xff1a;万国码utf-8&#xff1a;最短的字节长度8 英文&#xff1a;8bit&#xff0c;1 byte总结&#xff1a;as… · 2026/9/28 3:27:28

高效获取STM32开发参考方案:摆脱资料海洋,聚焦可落地项目
高效获取STM32开发参考方案:摆脱资料海洋,聚焦可落地项目

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 3:19:17

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介&#xff1a;这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程&#xff0c;从线性调频&#xff08;LFM&#xff09;信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑&#xff0c;面向电子信息工程、计算机、数学等专业学生&#xff0c;适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介&#xff1a;基于PyTorch的多模态虚假新闻检测项目完整代码包&#xff0c;面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者&#xff0c;解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征&#xff0c;以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码