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 解析器实现

Download history 340/week @ 2024-07-07 82/week @ 2024-07-14 147/week @ 2024-07-28 377/week @ 2024-08-04 195/week @ 2024-08-11

每月724次 下载
用于 holo-yang

MIT 许可证

120KB
2.5K SLoC

yang-rs

Crates.io Documentation MIT licensed Build Status codecov

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.0cmake 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_fileNO_STATE标志,因为示例json文件不包含状态数据。更多示例可以在这里找到。

许可证

本项目遵循MIT许可证

贡献

欢迎在GitHub上提交bug报告和pull requests:https://github.com/holo-routing/yang-rs

依赖

~7.5MB
~164K SLoC