co_primitives/types/
co_reference.rs1use crate::{Block, BlockSerializer, BlockSerializerError, KnownMultiCodec};
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
22#[non_exhaustive]
23pub enum CoReference<T> {
24 #[serde(rename = "w")]
26 Weak(T),
27}
28impl<T> CoReference<T> {
29 pub fn into_value(self) -> T {
30 match self {
31 CoReference::Weak(t) => t,
32 }
33 }
34
35 pub fn to_block(&self) -> Result<Block, BlockSerializerError>
36 where
37 T: Serialize,
38 {
39 BlockSerializer::new_codec(KnownMultiCodec::CoReference).serialize(self)
40 }
41}
42impl<T> AsRef<T> for CoReference<T> {
43 fn as_ref(&self) -> &T {
44 match self {
45 CoReference::Weak(t) => t,
46 }
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::CoReference;
53 use crate::{from_cbor, to_cbor};
54 use serde::de::IgnoredAny;
55
56 #[test]
57 fn test_serialize() {
58 let item = CoReference::Weak(1);
59 let encoded = to_cbor(&item).unwrap();
60 let decoded: CoReference<i32> = from_cbor(&encoded).unwrap();
61 assert_eq!(decoded, item);
62 let decoded: CoReference<IgnoredAny> = from_cbor(&encoded).unwrap();
63 assert_eq!(decoded, CoReference::Weak(IgnoredAny));
64 }
65}