Skip to main content

cesrox/primitives/codes/
self_addressing.rs

1use std::str::FromStr;
2
3use crate::{derivation_code::DerivationCode, error::Error};
4
5#[derive(Debug, PartialEq, Clone, Hash, Eq)]
6pub enum SelfAddressing {
7    Blake3_256,
8    Blake2B256(Vec<u8>),
9    Blake2S256(Vec<u8>),
10    SHA3_256,
11    SHA2_256,
12    Blake3_512,
13    SHA3_512,
14    Blake2B512,
15    SHA2_512,
16}
17
18impl DerivationCode for SelfAddressing {
19    fn value_size(&self) -> usize {
20        match self {
21            Self::Blake3_256
22            | Self::Blake2B256(_)
23            | Self::Blake2S256(_)
24            | Self::SHA3_256
25            | Self::SHA2_256 => 43,
26            Self::Blake3_512 | Self::SHA3_512 | Self::Blake2B512 | Self::SHA2_512 => 86,
27        }
28    }
29
30    fn soft_size(&self) -> usize {
31        0
32    }
33
34    fn hard_size(&self) -> usize {
35        match self {
36            Self::Blake3_256
37            | Self::Blake2B256(_)
38            | Self::Blake2S256(_)
39            | Self::SHA3_256
40            | Self::SHA2_256 => 1,
41            Self::Blake3_512 | Self::SHA3_512 | Self::Blake2B512 | Self::SHA2_512 => 2,
42        }
43    }
44
45    fn to_str(&self) -> String {
46        match self {
47            Self::Blake3_256 => "E",
48            Self::Blake2B256(_) => "F",
49            Self::Blake2S256(_) => "G",
50            Self::SHA3_256 => "H",
51            Self::SHA2_256 => "I",
52            Self::Blake3_512 => "0D",
53            Self::SHA3_512 => "0E",
54            Self::Blake2B512 => "0F",
55            Self::SHA2_512 => "0G",
56        }
57        .into()
58    }
59}
60
61impl FromStr for SelfAddressing {
62    type Err = Error;
63
64    fn from_str(s: &str) -> Result<Self, Self::Err> {
65        match s.get(..1).ok_or(Error::EmptyCodeError)? {
66            "E" => Ok(Self::Blake3_256),
67            "F" => Ok(Self::Blake2B256(vec![])),
68            "G" => Ok(Self::Blake2S256(vec![])),
69            "H" => Ok(Self::SHA3_256),
70            "I" => Ok(Self::SHA2_256),
71            "0" => match &s[1..2] {
72                "D" => Ok(Self::Blake3_512),
73                "E" => Ok(Self::SHA3_512),
74                "F" => Ok(Self::Blake2B512),
75                "G" => Ok(Self::SHA2_512),
76                _ => Err(Error::UnknownCodeError),
77            },
78            _ => Err(Error::UnknownCodeError),
79        }
80    }
81}
82
83pub fn dummy_prefix(derivation: &SelfAddressing) -> String {
84    "#".repeat(derivation.code_size() + derivation.value_size())
85}