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
use reth_db::{
    table::{Table, TableRow},
    DatabaseError,
};

use crate::libmdbx::types::CompressedTable;

#[derive(Debug)]
pub struct CompressedTableRow<T>(
    pub <T as Table>::Key,
    pub <T as CompressedTable>::DecompressedValue,
)
where
    T: CompressedTable,
    T::Value: From<T::DecompressedValue> + Into<T::DecompressedValue>;

impl<T> PartialEq for CompressedTableRow<T>
where
    T: CompressedTable,
    T::Value: From<T::DecompressedValue> + Into<T::DecompressedValue>,
{
    fn eq(&self, other: &Self) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}

impl<T> From<(<T as Table>::Key, <T as Table>::Value)> for CompressedTableRow<T>
where
    T: CompressedTable,
    T::Value: From<T::DecompressedValue> + Into<T::DecompressedValue>,
{
    fn from(value: TableRow<T>) -> Self {
        CompressedTableRow(value.0, value.1.into())
    }
}

impl<T> From<CompressedTableRow<T>> for TableRow<T>
where
    T: CompressedTable,
    T::Value: From<T::DecompressedValue> + Into<T::DecompressedValue>,
{
    fn from(val: CompressedTableRow<T>) -> TableRow<T> {
        (val.0, val.1.into())
    }
}

pub type CompressedPairResult<T> = Result<Option<CompressedTableRow<T>>, DatabaseError>;

pub type DecompressedValueOnlyResult<T> =
    Result<Option<<T as CompressedTable>::DecompressedValue>, DatabaseError>;

pub type IterCompressedPairResult<T> = Option<Result<CompressedTableRow<T>, DatabaseError>>;