Skip to main content

xet_client/cas_types/
key.rs

1use std::fmt::{Display, Formatter};
2use std::str::FromStr;
3
4use serde::{Deserialize, Serialize};
5use xet_core_structures::merklehash::MerkleHash;
6use xet_core_structures::merklehash::data_hash::hex;
7
8use crate::error::ClientError;
9
10/// A Key indicates a prefixed merkle hash for some data stored in the CAS DB.
11#[derive(Debug, PartialEq, Default, Serialize, Deserialize, Ord, PartialOrd, Eq, Hash, Clone)]
12pub struct Key {
13    pub prefix: String,
14    pub hash: MerkleHash,
15}
16
17impl Display for Key {
18    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19        write!(f, "{}/{:x}", self.prefix, self.hash)
20    }
21}
22
23impl FromStr for Key {
24    type Err = ClientError;
25
26    fn from_str(s: &str) -> Result<Self, Self::Err> {
27        let parts = s.rsplit_once('/');
28        let Some((prefix, hash)) = parts else {
29            return Err(ClientError::InvalidKey(s.to_owned()));
30        };
31
32        let hash = MerkleHash::from_hex(hash).map_err(|_| ClientError::InvalidKey(s.to_owned()))?;
33
34        Ok(Key {
35            prefix: prefix.to_owned(),
36            hash,
37        })
38    }
39}
40
41#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq, Hash)]
42pub struct HexMerkleHash(#[serde(with = "hex::serde")] pub MerkleHash);
43
44impl Display for HexMerkleHash {
45    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
46        write!(f, "{}", self.0.hex())
47    }
48}
49
50impl From<MerkleHash> for HexMerkleHash {
51    fn from(value: MerkleHash) -> Self {
52        HexMerkleHash(value)
53    }
54}
55
56impl From<HexMerkleHash> for MerkleHash {
57    fn from(value: HexMerkleHash) -> Self {
58        value.0
59    }
60}
61
62impl From<&HexMerkleHash> for MerkleHash {
63    fn from(value: &HexMerkleHash) -> Self {
64        value.0
65    }
66}
67
68impl From<&MerkleHash> for HexMerkleHash {
69    fn from(value: &MerkleHash) -> Self {
70        HexMerkleHash(*value)
71    }
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize, Default, Hash, PartialEq, Eq)]
75pub struct HexKey {
76    pub prefix: String,
77    #[serde(with = "hex::serde")]
78    pub hash: MerkleHash,
79}
80
81impl From<HexKey> for Key {
82    fn from(HexKey { prefix, hash }: HexKey) -> Self {
83        Key { prefix, hash }
84    }
85}
86
87impl From<Key> for HexKey {
88    fn from(Key { prefix, hash }: Key) -> Self {
89        HexKey { prefix, hash }
90    }
91}