30 个版本 (16 个破坏性更新)
0.17.0 | 2024年8月1日 |
---|---|
0.16.0 | 2024年7月12日 |
0.15.0 | 2024年7月12日 |
0.9.0 | 2024年1月24日 |
0.1.7 | 2021年3月5日 |
#226 在 解析器实现
每月483次下载
在 sysrepo 中使用
120KB
2.5K SLoC
yang2-rs
Rust 对 libyang2 库的绑定。
有关 libyang2 的原始 FFI 绑定,请参阅 libyang2-sys。
Cargo.toml
[dependencies]
yang2 = "0.17"
设计目标
- 使用 Rust 语法提供对 libyang2 的高层绑定
- 利用 Rust 的所有权系统在编译时检测 API 使用错误问题
- 自动资源管理
- 零成本抽象
功能标志
默认情况下,yang2-rs 使用预生成的 FFI 绑定并使用动态链接来加载 libyang2。但是,以下功能标志可以用来改变这种行为
- bundled:指示 cargo 从源代码下载和构建 libyang2。结果对象被组合成与该包链接的静态归档。当不希望有 libyang2 的动态链接依赖项时,可以使用此功能。
- 额外的构建要求: cc 1.0,cmake 0.1,C 编译器和 CMake。
- use_bindgen:动态生成新的 C FFI 绑定,而不是使用预生成的绑定。当需要更新此包以使用较新的 libyang2 版本时很有用。
- 额外的构建要求: bindgen 0.68.0
示例
一个基本的示例,该示例解析和验证 JSON 实例数据,然后将其转换为 XML 格式
use std::fs::File;
use yang2::context::{Context, ContextFlags};
use yang2::data::{
Data, DataFormat, DataParserFlags, DataPrinterFlags, DataTree,
DataValidationFlags,
};
static SEARCH_DIR: &str = "./assets/yang/";
fn main() -> std::io::Result<()> {
// Initialize context.
let mut ctx = Context::new(ContextFlags::NO_YANGLIBRARY)
.expect("Failed to create context");
ctx.set_searchdir(SEARCH_DIR)
.expect("Failed to set YANG search directory");
// Load YANG modules.
for module_name in &["ietf-interfaces", "iana-if-type"] {
ctx.load_module(module_name, None, &[])
.expect("Failed to load module");
}
// Parse and validate data tree in the JSON format.
let dtree = DataTree::parse_file(
&ctx,
File::open("./assets/data/interfaces.json")?,
DataFormat::JSON,
DataParserFlags::empty(),
DataValidationFlags::NO_STATE,
)
.expect("Failed to parse data tree");
// Print data tree in the XML format.
dtree
.print_file(
std::io::stdout(),
DataFormat::XML,
DataPrinterFlags::WD_ALL | DataPrinterFlags::WITH_SIBLINGS,
)
.expect("Failed to print data tree");
Ok(())
}
注意传递给 parse_file
的 NO_STATE
标志,因为示例 json 文件不包含状态数据。更多示例可以在 此处 找到。
许可证
此项目根据 MIT 许可证 许可。
贡献
欢迎在 GitHub 上提交错误报告和拉取请求 https://github.com/holo-routing/yang2-rs。
依赖项
~7.5MB
~163K SLoC