#parser #box #parser-combinator #builder #nom #zero-copy #content

jumbf

纯Rust编写的JUMBF (ISO/IEC 19566-5:2023) 解析器和构建器

6个版本 (3个破坏性版本)

0.4.0 2024年3月27日
0.3.0 2024年3月22日
0.2.2 2024年3月13日
0.1.0 2024年3月12日

#271解析器实现

Download history 13/week @ 2024-04-15 15/week @ 2024-04-22 19/week @ 2024-04-29 8/week @ 2024-05-06 8/week @ 2024-05-13 42/week @ 2024-05-20 7/week @ 2024-05-27 190/week @ 2024-06-03 59/week @ 2024-06-10 80/week @ 2024-06-17 365/week @ 2024-06-24 232/week @ 2024-07-01 908/week @ 2024-07-08 605/week @ 2024-07-15 684/week @ 2024-07-22 295/week @ 2024-07-29

每月下载量2,494
用于 c2pa

MIT/Apache

160KB
3K SLoC

jumbf

纯Rust编写的JUMBF (ISO/IEC 19566-5:2023) 解析器和构建器。

CI Latest Version docs.rs codecov

解析器

该解析器使用nom 解析器组合框架实现,并广泛使用零拷贝。由于该crate的解析功能依赖于 nomthiserror,这些功能通过名为 parser 的crate功能门控,默认情况下已包含。

该crate在理解盒内容方面故意保持最小化。仅理解 jumb (超级盒) 和 jumd (描述盒) 内容。其他所有盒类型(包括JUMBF标准中描述的其他类型)的内容通常是特定于应用的,因此该内容的含义留给调用者。

use hex_literal::hex;
use jumbf::parser::{DescriptionBox, SuperBox};

let jumbf = hex!(
    "0000002f" // box size
    "6a756d62" // box type = 'jumb'
        "00000027" // box size
        "6a756d64" // box type = 'jumd'
        "00000000000000000000000000000000" // UUID
        "03" // toggles
        "746573742e7375706572626f7800" // label
);

let (rem, sbox) = SuperBox::from_slice(&jumbf).unwrap();
assert!(rem.is_empty());

assert_eq!(
    sbox,
    SuperBox {
        desc: DescriptionBox {
            uuid: &[0; 16],
            label: Some("test.superbox"),
            requestable: true,
            id: None,
            hash: None,
            private: None,
            original: &jumbf[8..47],
        },
        child_boxes: vec!(),
        original: &jumbf,
    }
);

构建器

该crate还允许您构建JUMBF数据结构并将其序列化。

use std::io::Cursor;

use hex_literal::hex;
use jumbf::{builder::{DataBoxBuilder, SuperBoxBuilder}, BoxType};

const JSON_BOX_TYPE: BoxType = BoxType(*b"json");
const RANDOM_BOX_TYPE: BoxType = BoxType(*b"abcd");

let child_box1 = DataBoxBuilder::from_owned(
    JSON_BOX_TYPE,
    hex!("7b20226c6f636174696f6e223a20224d61726761"
                "746520436974792c204e4a227d")
    .to_vec(),
);

let child_box2 = DataBoxBuilder::from_borrowed(RANDOM_BOX_TYPE, b"ABCD");

let sbox = SuperBoxBuilder::new(&hex!("00000000000000000000000000000000"))
    .add_child_box(child_box1)
    .add_child_box(child_box2);

let mut jumbf = Cursor::new(Vec::<u8>::new());
sbox.write_jumbf(&mut jumbf).unwrap();

仅构建器依赖减少

该构建器可以单独构建,在该配置下没有第三方crate依赖。如果您只需要构建JUMBF数据结构并想减少编译时间开销,可以通过以下方式导入此crate来禁用 parser 功能:

jumbf = { version = "x.x", default-features = false }

贡献和反馈

我们欢迎对该项目的贡献。有关贡献、提供反馈以及关于正在进行的工作的信息,请参阅 贡献

要求

该crate需要 Rust版本1.74.0 或更高版本。当需要新的Rust版本时,将发布此crate的新次要版本(1.x.0)。

支持的平台

该crate已在以下操作系统上进行了测试

  • Windows(重要:Windows上仅支持MSVC构建链。我们欢迎PR以在Windows上启用GNU构建链支持。)
  • MacOS(Intel和Apple硅芯片)
  • 在x86和ARM v8(aarch64)上的Ubuntu Linux

许可证

jumbf 库同时遵循 MIT 许可协议和 Apache 许可协议(版本 2.0)。

请参阅 LICENSE-APACHELICENSE-MIT

请注意,某些组件和依赖库的许可协议不同;请查看每个库和组件的许可协议以获取详细信息。

变更日志

有关从 Git 提交历史中得出的详细变更,请参阅 CHANGELOG

依赖项

~0–325KB