#ion #binary #binary-parser #binary-format #amazon #encode #parse

ion-binary-rs

纯Rust解析器、编码器和哈希器,用于Amazon的Ion二进制格式

28个版本

0.8.13 2024年2月2日
0.8.12 2023年10月1日
0.8.11 2022年10月21日
0.8.10 2022年7月17日
0.7.0 2020年11月18日

网络编程类别中排名第124

Download history 6215/week @ 2024-03-14 6080/week @ 2024-03-21 6144/week @ 2024-03-28 6144/week @ 2024-04-04 6061/week @ 2024-04-11 6074/week @ 2024-04-18 6010/week @ 2024-04-25 5995/week @ 2024-05-02 5908/week @ 2024-05-09 6088/week @ 2024-05-16 6182/week @ 2024-05-23 6267/week @ 2024-05-30 6118/week @ 2024-06-06 6122/week @ 2024-06-13 6096/week @ 2024-06-20 4759/week @ 2024-06-27

每月下载量达24,455次
qldb中使用

Apache-2.0/MIT

315KB
7K SLoC

Ion二进制解析器/编码器与Rust中的Ion哈希

Ion二进制是一个用于解析、编码和哈希Amazon的Ion二进制格式的Rust库。

Coverage Status Documentation Crates.io

它可以解析、编码和哈希任何传递给它的事物。任何未能完成这些任务的情况都是我们将会修复的bug,如果你能报告这些bug,我们将非常高兴。

代码成熟,测试比Amazon的替代方案(包括他们的js库)要充分得多。Amazon在实现“良好的测试”时,只检查它是否可以解析。我们还会检查值是否正确。此外,我们似乎实现了比Amazon库更多的ion协议,因为我们测试文件中没有巨大的跳过列表。我们测试了所有的测试套件,而不仅仅是几个测试。

如何使用此库

首先,你需要了解我们为这个库所做出的权衡

  • API返回字符串而不是符号。如果需要,我们可以添加符号,但我们认为字符串是最直观的方式。
  • 在解析/解码时,你可以为没有所有必需符号的二进制blob添加共享表。

我们已经实现了Amazon的整个Ion测试套件用于解析。编码和哈希已经完全测试。我们正在努力扩大覆盖率。我们非常欢迎你报告任何bug。你可以查看所有测试以获取示例。

示例

解析


use ion_binary_rs::IonParser;

// This is the response from Amazon's QLDB introduction example using Rusoto
let ion_test = b"\xe0\x01\0\xea\xee\xa6\x81\x83\xde\xa2\x87\xbe\x9f\x83VIN\x84Type\x84Year\x84Make\x85Model\x85Color\xde\xb9\x8a\x8e\x911C4RJFAG0FC625797\x8b\x85Sedan\x8c\"\x07\xe3\x8d\x88Mercedes\x8e\x87CLK 350\x8f\x85White";

let mut parser = IonParser::new(&ion_test[..]);

println!("Decoded Ion: {:?}", parser.consume_all().unwrap())
// Decoded Ion: [Struct({"Color": String("White"), "Year": Integer(2019), "VIN": String("1C4RJFAG0FC625797"), "Make": String("Mercedes"), "Model": String("CLK 350"), "Type": String("Sedan")})]

编码


use ion_binary_rs::{IonEncoder, IonParser, IonValue};
use std::collections::HashMap;

let mut ion_struct = HashMap::new();

ion_struct.insert("Model".to_string(), IonValue::String("CLK 350".to_string()));
ion_struct.insert("Type".to_string(), IonValue::String("Sedan".to_string()));
ion_struct.insert("Color".to_string(), IonValue::String("White".to_string()));
ion_struct.insert(
    "VIN".to_string(),
    IonValue::String("1C4RJFAG0FC625797".to_string()),
);
ion_struct.insert("Make".to_string(), IonValue::String("Mercedes".to_string()));
ion_struct.insert("Year".to_string(), IonValue::Integer(2019));

let ion_value = IonValue::Struct(ion_struct);

let mut encoder = IonEncoder::new();

encoder.add(ion_value.clone());
let bytes = encoder.encode();

let resulting_ion_value = IonParser::new(&bytes[..]).consume_value().unwrap().0;

assert_eq!(ion_value, resulting_ion_value);

哈希

use sha2::Sha256;
use ion_binary_rs::{IonHash, IonValue};
use std::collections::HashMap;

let mut ion_struct = HashMap::new();

ion_struct.insert("Model".to_string(), IonValue::String("CLK 350".to_string()));
ion_struct.insert("Type".to_string(), IonValue::String("Sedan".to_string()));
ion_struct.insert("Color".to_string(), IonValue::String("White".to_string()));
ion_struct.insert(
    "VIN".to_string(),
    IonValue::String("1C4RJFAG0FC625797".to_string()),
);
ion_struct.insert("Make".to_string(), IonValue::String("Mercedes".to_string()));
ion_struct.insert("Year".to_string(), IonValue::Integer(2019));

let ion_value = IonValue::Struct(ion_struct);

let hash = IonHash::digest::<Sha256>(&ion_value);

println!("{:X?}", hash);

安全Rust

在此crate中没有直接使用任何不安全代码。你可以在lib.rs中查看#![deny(unsafe_code)]行。

贡献

如果您决定检查库并/或为其做出贡献,我们将感到非常高兴!只需提交一个问题或拉取请求,我们就可以查看您想实现的内容。欢迎进行错误查找和提出建议。当然,您随时可以提出任何问题。

许可证

根据您的选择,该库受Apache License, Version 2.0MIT许可证的许可。
除非您明确说明,否则根据Apache-2.0许可证的定义,您有意提交的任何贡献,包括在本库中的包含,都将如上所述双许可,不附加任何额外条款或条件。

依赖关系

~3–4MB
~85K SLoC