1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use crate::Error;

/// A trait used to convert between types and `Raw`
pub trait Value: Sized {
    /// Wrapper around AsRef<[u8]>
    fn to_raw_value(&self) -> Result<Raw, Error>;

    /// Convert from Raw
    fn from_raw_value(r: Raw) -> Result<Self, Error>;
}

/// Raw is an alias for `sled::IVec`
pub type Raw = sled::IVec;

impl Value for Raw {
    fn to_raw_value(&self) -> Result<Raw, Error> {
        Ok(self.clone())
    }

    fn from_raw_value(r: Raw) -> Result<Self, Error> {
        Ok(r)
    }
}

impl Value for std::sync::Arc<[u8]> {
    fn to_raw_value(&self) -> Result<Raw, Error> {
        Ok(self.as_ref().into())
    }

    fn from_raw_value(r: Raw) -> Result<Self, Error> {
        Ok(r.as_ref().into())
    }
}

impl Value for Vec<u8> {
    fn to_raw_value(&self) -> Result<Raw, Error> {
        Ok(self.as_slice().into())
    }

    fn from_raw_value(r: Raw) -> Result<Self, Error> {
        Ok(r.to_vec())
    }
}

impl Value for String {
    fn to_raw_value(&self) -> Result<Raw, Error> {
        Ok(self.as_str().into())
    }

    fn from_raw_value(r: Raw) -> Result<Self, Error> {
        let x = r.to_vec();
        Ok(String::from_utf8(x)?)
    }
}