#byte #hex #hash #serde #serde-json #serde-yaml #json

stdto_derive

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

13 个重大版本

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

#13 in #serde-yaml

Download history 1/week @ 2024-03-20 36/week @ 2024-03-27 6/week @ 2024-04-03

52 每月下载量
用于 stdto

MIT/Apache

17KB
322

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);

依赖关系

~1.5MB
~36K SLoC