#byte #hex #hash #serde #hex-string #json

stdto

Stdto提供了一组功能特性,用于在各种数据表示之间进行转换

13个重大版本发布

0.14.0 2023年3月1日
0.13.0 2022年12月26日
0.12.0 2022年12月22日

#2095编码

每月下载量:39

MIT/Apache

62KB
1.5K SLoC

Stdto

stdto提供了一组功能特性,用于在各种数据表示之间进行转换。

CI Crates.io Licensed Twitter

| 示例 | 文档 | 最新日志 |

stdto = "0.14.0"

目标

作为一名专门从事Rust区块链开发的开发者,我经常发现处理字节、哈希和JSON具有挑战性。Rust生态系统是分散的,许多流行的crate都很老且复杂。这使得寻找简单、抽象良好且易于理解的解决方案变得困难。我创建了Stdto crate来满足这一需求。Stdto的目标是提供一个类似标准库的接口,使用户能够轻松地使用和理解原始数据结构。

功能

default = ["derive", "serde", "bytes", "hash", "json", "yaml", "toml", "file", "hex"]
cargo add stdto  # [derive, serde, bytes, hash, json, yaml, toml, file, hex]
cargo add stdto --features "derive bytes" # [derive, serde, bytes]
cargo add stdto --features "derive hash" # [derive, serde, bytes, hash]
cargo add stdto --features "derive json" # [derive, serde, json]
cargo add stdto --features "derive yaml" # [derive, serde, yaml]
cargo add stdto --features "derive toml" # [derive, serde, toml]
cargo add stdto --features "derive file" # [derive, serde, json, yaml, toml]
cargo add stdto --features "derive hex" # [derive, hex]

示例

use stdto::prelude::*;
// #[stdto::bytes(endian = "little")]
#[stdto::bytes]
struct Test {
    a: u32,
    b: String,
    c: [u8; 32],
    d: Vec<u8>,
    e: BTreeMap<String, f64>,
}

let bytes = Test { .. }.to_bytes();
let test = Test::from_bytes(bytes);
// Test::try_from_bytes(bytes).unwrap();
#[stdto::bytes]
#[stdto::hash]
struct Test {
    ...
}

let hash = test.to_hash::<sha2::Sha256>();
// Any digest crate implemented hasher type
#[stdto::json]
// #[stdto::yaml]
// #[stdto::toml]
struct Test {
    ...
}

let json = test.to_json();
let test = Test::from_json(json);
// Test::try_from_json(json).unwrap();

// let yaml = test.to_yaml();
// let test = Test::from_yaml(yaml);
// let toml = test.to_toml();
// let test = Test::from_toml(toml);
// Any AsRef<[u8]> or AsBytes implemented to hex

let hex = bytes.to_hex();
let hex = hash.to_hex();
let bytes = Vec::<u8>::from_hex(hex);
// Vec::<u8>::try_from_hex(hex).unwrap();

let mut arr = [0u8; 32];
arr.copy_from_hex(hex);
// Any AsRef<[u8]> or AsBytes implemented <-> String, &str

let arr = [72, 105, 77, 111, 109];
let s1 = arr.into_string(); // .try_into_string().unwrap();
let bytes = s1.to_bytes();
let s2 = bytes.as_str(); // .try_as_str().unwrap();

assert_eq!(s1, s2);

依赖项

~0.3–1.4MB
~30K SLoC