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
每月下载量达24,455次
在qldb中使用
315KB
7K SLoC
Ion二进制解析器/编码器与Rust中的Ion哈希
Ion二进制是一个用于解析、编码和哈希Amazon的Ion二进制格式的Rust库。
它可以解析、编码和哈希任何传递给它的事物。任何未能完成这些任务的情况都是我们将会修复的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.0或MIT许可证的许可。除非您明确说明,否则根据Apache-2.0许可证的定义,您有意提交的任何贡献,包括在本库中的包含,都将如上所述双许可,不附加任何额外条款或条件。
依赖关系
~3–4MB
~85K SLoC