7个不稳定版本 (3个破坏性更新)

0.4.1 2024年3月28日
0.4.0 2024年3月26日
0.3.2 2024年3月14日
0.2.0 2024年2月23日
0.1.0 2024年1月25日

#315 in 编码

Download history 210/week @ 2024-04-14 169/week @ 2024-04-21 260/week @ 2024-04-28 356/week @ 2024-05-05 467/week @ 2024-05-12 508/week @ 2024-05-19 223/week @ 2024-05-26 240/week @ 2024-06-02 330/week @ 2024-06-09 503/week @ 2024-06-16 376/week @ 2024-06-23 491/week @ 2024-06-30 337/week @ 2024-07-07 296/week @ 2024-07-14 289/week @ 2024-07-21 452/week @ 2024-07-28

每月1,404次下载
14 个crate中使用了 (7 个直接使用)

MIT/Apache

92KB
2K SLoC

IPLD核心

Crates.io Documentation

这个crate提供了与IPLD交互的核心类型。编解码器不是此crate的一部分,它们是独立的,但依赖于ipld-core

代码基于libipld-core。主要区别是Serde被大量使用,以更好地与Rust生态系统中的其他部分进行交互。

用法

与编解码器无关的代码

IPLD的一个主要特性是您的编解码器与您正在编码的数据无关。因此,您可能希望您的代码对特定的编解码器独立,而是通用的。

以下是一个可以同时使用serde_ipld_dagcborserde_ipld_dagjson进行数据编码的函数的完整示例。

use std::str;

use ipld_core::codec::Codec;
use serde::{Deserialize, Serialize};
use serde_ipld_dagcbor::codec::DagCborCodec;
use serde_ipld_dagjson::codec::DagJsonCodec;

#[derive(Deserialize, Serialize)]
struct Tree {
    height: u8,
    age: u8,
}

fn encode_generic<C, T>(value: &T) -> Result<Vec<u8>, C::Error>
where
    C: Codec<T>,
{
    C::encode_to_vec(value)
}

fn main() {
    let tree = Tree {
        height: 12,
        age: 91,
    };

    let cbor_encoded = encode_generic::<DagCborCodec, _>(&tree);
    #[allow(clippy::format_collect)]
    let cbor_hex = cbor_encoded
        .unwrap()
        .iter()
        .map(|byte| format!("{:02x}", byte))
        .collect::<String>();
    // CBOR encoded: https://cbor.nemo157.com/#value=a2666865696768740c63616765185b
    println!("CBOR encoded: https://cbor.nemo157.com/#value={}", cbor_hex);
    let json_encoded = encode_generic::<DagJsonCodec, _>(&tree).unwrap();
    // JSON encoded: {"height":12,"age":91}
    println!("JSON encoded: {}", str::from_utf8(&json_encoded).unwrap());
}

如果您只对编码的IPLD对象的链接(CIDs)感兴趣,则可以直接使用[Codec::links()]

use ipld_core::{codec::{Codec, Links}, ipld, cid::Cid};
use serde_ipld_dagjson::codec::DagJsonCodec;

fn main() {
    let cid = Cid::try_from("bafkreibme22gw2h7y2h7tg2fhqotaqjucnbc24deqo72b6mkl2egezxhvy").unwrap();
    let data = ipld!({"some": {"nested": cid}, "or": [cid, cid], "more": true});

    let mut encoded = Vec::new();
    DagJsonCodec::encode(&mut encoded, &data).unwrap();

    let links = DagJsonCodec::links(&encoded).unwrap().collect::<Vec<_>>();
    // Extracted links: [Cid(bafkreibme22gw2h7y2h7tg2fhqotaqjucnbc24deqo72b6mkl2egezxhvy), Cid(bafkreibme22gw2h7y2h7tg2fhqotaqjucnbc24deqo72b6mkl2egezxhvy), Cid(bafkreibme22gw2h7y2h7tg2fhqotaqjucnbc24deqo72b6mkl2egezxhvy)]
    println!("Extracted links: {:?}", links);
}

功能标志

  • std(默认启用):使错误实现std::error::ErrorCodec trait可用。
  • codec(默认启用):提供Codec trait,该trait使得编码和解码与IPLD编解码器无关。通过禁用此功能,可以将最小支持的Rust版本(MSRV)显著降低到1.64。
  • serde:启用对Ipld枚举的Serde序列化和反序列化的支持。
  • arb:启用对基于属性的测试的支持。

许可证

根据以下任一许可证授权:

根据您的选择。

依赖项

~1.7–2.4MB
~49K SLoC