subspace_networking/utils/
multihash.rs1use std::error::Error;
4use subspace_core_primitives::pieces::PieceIndex;
5
6pub type Multihash = libp2p::multihash::Multihash<64>;
8
9const SUBSPACE_MULTICODEC_NAMESPACE_START: u64 = 0xb39910;
12
13#[derive(Debug, Clone, PartialEq)]
15#[repr(u64)]
16pub enum MultihashCode {
17 PieceIndex = SUBSPACE_MULTICODEC_NAMESPACE_START,
19}
20
21impl From<MultihashCode> for u64 {
22 #[inline]
23 fn from(code: MultihashCode) -> Self {
24 code as u64
25 }
26}
27
28impl TryFrom<u64> for MultihashCode {
29 type Error = Box<dyn Error>;
30
31 #[inline]
32 fn try_from(value: u64) -> Result<Self, Self::Error> {
33 match value {
34 x if x == MultihashCode::PieceIndex as u64 => Ok(MultihashCode::PieceIndex),
35 _ => Err("Unexpected multihash code".into()),
36 }
37 }
38}
39
40pub trait ToMultihash {
42 fn to_multihash(&self) -> Multihash;
44 fn to_multihash_by_code(&self, code: MultihashCode) -> Multihash;
46}
47
48impl ToMultihash for PieceIndex {
49 fn to_multihash(&self) -> Multihash {
50 self.to_multihash_by_code(MultihashCode::PieceIndex)
51 }
52
53 fn to_multihash_by_code(&self, code: MultihashCode) -> Multihash {
54 Multihash::wrap(u64::from(code), &self.to_bytes())
55 .expect("Input never exceeds allocated size; qed")
56 }
57}