use crate::{Block, BlockSerializer, BlockSerializerError, KnownMultiCodec};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[non_exhaustive]
pub enum CoReference<T> {
#[serde(rename = "w")]
Weak(T),
}
impl<T> CoReference<T> {
pub fn into_value(self) -> T {
match self {
CoReference::Weak(t) => t,
}
}
pub fn to_block(&self) -> Result<Block, BlockSerializerError>
where
T: Serialize,
{
BlockSerializer::new_codec(KnownMultiCodec::CoReference).serialize(self)
}
}
impl<T> AsRef<T> for CoReference<T> {
fn as_ref(&self) -> &T {
match self {
CoReference::Weak(t) => t,
}
}
}
#[cfg(test)]
mod tests {
use super::CoReference;
use crate::{from_cbor, to_cbor};
use serde::de::IgnoredAny;
#[test]
fn test_serialize() {
let item = CoReference::Weak(1);
let encoded = to_cbor(&item).unwrap();
let decoded: CoReference<i32> = from_cbor(&encoded).unwrap();
assert_eq!(decoded, item);
let decoded: CoReference<IgnoredAny> = from_cbor(&encoded).unwrap();
assert_eq!(decoded, CoReference::Weak(IgnoredAny));
}
}