Skip to main content

co_primitives/types/
weak_cid.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 1io BRANDGUARDIAN GmbH
3
4use crate::CoCid;
5use cid::{serde::BytesToCidVisitor, Cid};
6use serde::{Deserialize, Serialize};
7use std::{borrow::Borrow, ops::Deref};
8
9/// A CID that will be serialized as just bytes and will not be returned by [`crate::BlockLinks`].
10#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq, PartialOrd, Ord, schemars::JsonSchema)]
11pub struct WeakCid(#[schemars(with = "CoCid")] Cid);
12impl WeakCid {
13	pub fn new(cid: Cid) -> Self {
14		Self(cid)
15	}
16
17	pub fn cid(&self) -> Cid {
18		self.0
19	}
20}
21impl From<Cid> for WeakCid {
22	fn from(value: Cid) -> Self {
23		Self(value)
24	}
25}
26impl From<&Cid> for WeakCid {
27	fn from(value: &Cid) -> Self {
28		Self(*value)
29	}
30}
31impl From<WeakCid> for Cid {
32	fn from(value: WeakCid) -> Self {
33		value.0
34	}
35}
36impl<'de> Deserialize<'de> for WeakCid {
37	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38	where
39		D: serde::Deserializer<'de>,
40	{
41		Ok(Self(deserializer.deserialize_bytes(BytesToCidVisitor)?))
42	}
43}
44impl Serialize for WeakCid {
45	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
46	where
47		S: serde::Serializer,
48	{
49		let mut buf = [0u8; 128];
50		let len = self
51			.0
52			.write_bytes(&mut buf[..])
53			.expect("CID to serialize to bytes and fit into 128 bytes");
54		serializer.serialize_bytes(&buf[0..len])
55	}
56}
57impl AsRef<Cid> for WeakCid {
58	fn as_ref(&self) -> &Cid {
59		&self.0
60	}
61}
62impl Borrow<Cid> for WeakCid {
63	fn borrow(&self) -> &Cid {
64		&self.0
65	}
66}
67impl Borrow<Cid> for &WeakCid {
68	fn borrow(&self) -> &Cid {
69		&self.0
70	}
71}
72impl Deref for WeakCid {
73	type Target = Cid;
74
75	fn deref(&self) -> &Self::Target {
76		&self.0
77	}
78}