cesrox/primitives/codes/
self_addressing.rs1use 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}