7个版本 (重大更改)
0.7.0 | 2024年8月6日 |
---|---|
0.6.0 | 2024年8月1日 |
0.5.0 | 2024年7月13日 |
0.4.0 | 2024年7月12日 |
0.1.0 | 2024年7月8日 |
#935 in 解析器实现
每月724次 下载
用于 holo-yang
120KB
2.5K SLoC
yang-rs
Rust语言对libyang库的绑定。
对于libyang的原始FFI绑定,请参阅libyang3-sys。
Cargo.toml
[dependencies]
yang3 = "0.7"
设计目标
- 使用惯用的Rust提供libyang的高级绑定
- 利用Rust的所有权系统,在编译时检测API误用问题
- 自动资源管理
- 零成本抽象
功能标志
默认情况下,yang-rs使用预先生成的FFI绑定,并使用动态链接加载libyang。但是,以下功能标志可以用来更改此行为
- bundled:指示cargo从源代码下载和构建libyang。生成的对象被组合成一个静态库,并将其链接到本crate。当不希望有libyang动态链接依赖时,可以使用此功能。
- 额外的构建要求:cc 1.0,cmake 0.1,C编译器和CMake。
- use_bindgen:动态生成新的C FFI绑定,而不是使用预先生成的绑定。当更新此crate以使用新的libyang版本时很有用。
- 额外的构建要求:bindgen 0.68.0
示例
一个基本的示例,解析和验证JSON实例数据,并将其转换为XML格式
use std::fs::File;
use yang3::context::{Context, ContextFlags};
use yang3::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上提交bug报告和pull requests:https://github.com/holo-routing/yang-rs。
依赖
~7.5MB
~164K SLoC