A better Rust ATProto crate
102
fork

Configure Feed

Select the types of activity you want to include in your feed.

new binaries, little patch for CID deser

Orual 90f0d798 9d02ba1a

+63 -10
+10 -2
CHANGELOG.md
··· 1 1 # Changelog 2 2 3 + ## [0.10.1] - 2026-03-20 (`jacquard-common`) 4 + 5 + ### Fixed 6 + 7 + **CID deserialization** (`jacquard-common`) 8 + - Fixed `CidLink` deserialization from CBOR tag-42 bytes through internally-tagged enums (reported by @natalie.sh, fixed by adorable robot) 9 + - `serde_ipld_dagcbor` buffers tag-42 CIDs as a newtype struct wrapping raw bytes when deserializing through `Content`; the visitor now handles `visit_bytes`, `visit_byte_buf`, and `visit_newtype_struct` to cover this path 10 + 3 11 ## [0.10.0] - 2026-03-20 4 12 5 13 ### Breaking changes ··· 20 28 - `jacquard-api` gains feature gating for `std`/`no_std` usage 21 29 22 30 **Datetime improvements** (`jacquard-common`) 23 - - [PR from @blyoom.dev](https://tangled.org/nonbinary.computer/jacquard/pulls/6/round/0) exposing timestamps directly on `Datetime` type 31 + - [PR from @blyoom.dev](https://tangled.org/nonbinary.computer/jacquard/pulls/6/) exposing timestamps directly on `Datetime` type 24 32 - Naming aligned with `chrono` conventions 25 33 26 34 **Handle normalization** (`jacquard-common`) ··· 44 52 ### Fixed 45 53 46 54 **Identity resolution** (`jacquard-identity`) 47 - - [PR from @alephcubed.com](https://tangled.org/nonbinary.computer/jacquard/pulls/7/round/0) fixing `DidDocument::handles()` always failing when parsed from `MiniDoc` 55 + - [PR from @alephcubed.com](https://tangled.org/nonbinary.computer/jacquard/pulls/7/) fixing `DidDocument::handles()` always failing when parsed from `MiniDoc` 48 56 49 57 **Error handling** (`jacquard-common`, `jacquard`, `jacquard-oauth`) 50 58 - Big error quality-of-life pass with richer, more actionable diagnostics
+1 -1
Cargo.lock
··· 2468 2468 2469 2469 [[package]] 2470 2470 name = "jacquard-common" 2471 - version = "0.10.0" 2471 + version = "0.10.1" 2472 2472 dependencies = [ 2473 2473 "base64 0.22.1", 2474 2474 "bon",
+6 -6
binaries/SHA256SUMS
··· 1 - 4cee5d4386394d5de7c3bf958a8697331468be29b1a0287ede7e7777a3e133cc jacquard-codegen_aarch64-unknown-linux-gnu.tar.xz 2 - 0ae250caacabaf1fbd96e7a09b726863ce1050b3914c0124c1e928a693282aff jacquard-codegen_x86_64-unknown-linux-gnu.tar.xz 3 - 7f1424e93f16b8e506b0d7fc72f4afa85262dfda074e06e37419e77be49e293c lex-fetch_aarch64-unknown-linux-gnu.tar.xz 4 - 59d6f3acfbfdc4ef492745ef56fcbe112cde83e67b672cd1396daeee164c487c lex-fetch_x86_64-unknown-linux-gnu.tar.xz 5 - 777ef7d9a7a4e327d88a738b9d82b50ae57b571cd5e271b09616022e2b420587 jacquard-codegen_x86_64-pc-windows-gnu.zip 6 - f36d0c89e7e6db54ef79c18eccfc400cd4a107eb2cfe2e4e09e080cefc17d96f lex-fetch_x86_64-pc-windows-gnu.zip 1 + 1c446bab1beceef71d0e9399cba605a7f20724c876ebb6079018f9f7e12265ae jacquard-codegen_aarch64-unknown-linux-gnu.tar.xz 2 + abfcfa4289f81b0e33a98b2406c5aee11fff87bd8d1f7cb7b8e4ab3b0d5b1ef7 jacquard-codegen_x86_64-unknown-linux-gnu.tar.xz 3 + 785364234c0749b06a887cc847a5cd1636c4462b82c0609356b528f96b2cbc7c lex-fetch_aarch64-unknown-linux-gnu.tar.xz 4 + acadba83882e67fe05b1ea561f30fa3237cb16ed95d4bf6a07d1a3d1fe4f0dfe lex-fetch_x86_64-unknown-linux-gnu.tar.xz 5 + 060fcda31d081c72289d06614c280c422c4e64cef12516cfa8cc5262f62753c7 jacquard-codegen_x86_64-pc-windows-gnu.zip 6 + b2497864ce0d178d32a137e24df55f1687de60b5e53ea2f1a14f24f1e65d4923 lex-fetch_x86_64-pc-windows-gnu.zip
binaries/jacquard-codegen_aarch64-unknown-linux-gnu.tar.xz

This is a binary file and will not be displayed.

binaries/jacquard-codegen_x86_64-pc-windows-gnu.zip

This is a binary file and will not be displayed.

binaries/jacquard-codegen_x86_64-unknown-linux-gnu.tar.xz

This is a binary file and will not be displayed.

binaries/lex-fetch_aarch64-unknown-linux-gnu.tar.xz

This is a binary file and will not be displayed.

binaries/lex-fetch_x86_64-pc-windows-gnu.zip

This is a binary file and will not be displayed.

binaries/lex-fetch_x86_64-unknown-linux-gnu.tar.xz

This is a binary file and will not be displayed.

+1 -1
crates/jacquard-common/Cargo.toml
··· 2 2 name = "jacquard-common" 3 3 description = "Core AT Protocol types and utilities for Jacquard" 4 4 edition.workspace = true 5 - version = "0.10.0" 5 + version = "0.10.1" 6 6 authors.workspace = true 7 7 repository.workspace = true 8 8 keywords.workspace = true
+45
crates/jacquard-common/src/types/cid.rs
··· 385 385 Ok(CidLink::cow_str(v.to_cowstr()).into_static()) 386 386 } 387 387 388 + fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> 389 + where 390 + E: serde::de::Error, 391 + { 392 + Cid::new_owned(v).map(CidLink).map_err(E::custom) 393 + } 394 + 395 + fn visit_byte_buf<E>(self, v: alloc::vec::Vec<u8>) -> Result<Self::Value, E> 396 + where 397 + E: serde::de::Error, 398 + { 399 + self.visit_bytes(&v) 400 + } 401 + 402 + fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 403 + where 404 + D: serde::de::Deserializer<'de>, 405 + { 406 + // serde_ipld_dagcbor buffers CBOR tag-42 CIDs as a newtype struct wrapping 407 + // raw CID bytes when deserializing through internally-tagged enums (Content). 408 + // Must use deserialize_bytes (not Vec<u8>'s deserialize_seq) to avoid 409 + // "byte array, expected a sequence" from ContentDeserializer. 410 + struct BytesVisitor; 411 + impl<'de> Visitor<'de> for BytesVisitor { 412 + type Value = alloc::vec::Vec<u8>; 413 + fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { 414 + f.write_str("CID bytes") 415 + } 416 + fn visit_bytes<E: serde::de::Error>( 417 + self, 418 + v: &[u8], 419 + ) -> Result<Self::Value, E> { 420 + Ok(v.to_vec()) 421 + } 422 + fn visit_byte_buf<E: serde::de::Error>( 423 + self, 424 + v: alloc::vec::Vec<u8>, 425 + ) -> Result<Self::Value, E> { 426 + Ok(v) 427 + } 428 + } 429 + let bytes = deserializer.deserialize_bytes(BytesVisitor)?; 430 + self.visit_byte_buf(bytes) 431 + } 432 + 388 433 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> 389 434 where 390 435 A: serde::de::MapAccess<'de>,