Skip to main content

grovedb_version/
lib.rs

1use version::GroveVersion;
2
3pub mod error;
4pub mod version;
5
6#[macro_export]
7macro_rules! check_grovedb_v0_with_cost {
8    ($method:expr, $version:expr) => {{
9        const EXPECTED_VERSION: u16 = 0;
10        if $version != EXPECTED_VERSION {
11            return grovedb_costs::CostsExt::wrap_with_cost(
12                Err($crate::error::GroveVersionError::UnknownVersionMismatch {
13                    method: $method.to_string(),
14                    known_versions: vec![EXPECTED_VERSION],
15                    received: $version,
16                }
17                .into()),
18                Default::default(),
19            );
20        }
21    }};
22}
23
24#[macro_export]
25macro_rules! check_grovedb_v0 {
26    ($method:expr, $version:expr) => {{
27        const EXPECTED_VERSION: u16 = 0;
28        if $version != EXPECTED_VERSION {
29            return Err($crate::error::GroveVersionError::UnknownVersionMismatch {
30                method: $method.to_string(),
31                known_versions: vec![EXPECTED_VERSION],
32                received: $version,
33            }
34            .into());
35        }
36    }};
37}
38
39#[macro_export]
40macro_rules! check_grovedb_v0_or_v1_with_cost {
41    ($method:expr, $version:expr) => {{
42        const EXPECTED_VERSION_V0: u16 = 0;
43        const EXPECTED_VERSION_V1: u16 = 1;
44        if $version != EXPECTED_VERSION_V0 && $version != EXPECTED_VERSION_V1 {
45            return grovedb_costs::CostsExt::wrap_with_cost(
46                Err($crate::error::GroveVersionError::UnknownVersionMismatch {
47                    method: $method.to_string(),
48                    known_versions: vec![EXPECTED_VERSION_V0, EXPECTED_VERSION_V1],
49                    received: $version,
50                }
51                .into()),
52                Default::default(),
53            );
54        }
55    }};
56}
57
58#[macro_export]
59macro_rules! check_grovedb_v0_or_v1 {
60    ($method:expr, $version:expr) => {{
61        const EXPECTED_VERSION_V0: u16 = 0;
62        const EXPECTED_VERSION_V1: u16 = 1;
63        if $version != EXPECTED_VERSION_V0 && $version != EXPECTED_VERSION_V1 {
64            return Err(GroveVersionError::UnknownVersionMismatch {
65                method: $method.to_string(),
66                known_versions: vec![EXPECTED_VERSION_V0, EXPECTED_VERSION_V1],
67                received: $version,
68            }
69            .into());
70        }
71        $version
72    }};
73}
74
75#[macro_export]
76macro_rules! check_grovedb_v0_v1_or_v2 {
77    ($method:expr, $version:expr) => {{
78        const EXPECTED_VERSION_V0: u16 = 0;
79        const EXPECTED_VERSION_V1: u16 = 1;
80        const EXPECTED_VERSION_V2: u16 = 2;
81        if $version != EXPECTED_VERSION_V0
82            && $version != EXPECTED_VERSION_V1
83            && $version != EXPECTED_VERSION_V2
84        {
85            return Err($crate::error::GroveVersionError::UnknownVersionMismatch {
86                method: $method.to_string(),
87                known_versions: vec![
88                    EXPECTED_VERSION_V0,
89                    EXPECTED_VERSION_V1,
90                    EXPECTED_VERSION_V2,
91                ],
92                received: $version,
93            }
94            .into());
95        }
96        $version
97    }};
98}
99
100#[macro_export]
101macro_rules! check_merk_v0_with_cost {
102    ($method:expr, $version:expr) => {{
103        const EXPECTED_VERSION: u16 = 0;
104        if $version != EXPECTED_VERSION {
105            return grovedb_costs::CostsExt::wrap_with_cost(
106                Err($crate::error::GroveVersionError::UnknownVersionMismatch {
107                    method: $method.to_string(),
108                    known_versions: vec![EXPECTED_VERSION],
109                    received: $version,
110                }
111                .into()),
112                Default::default(),
113            );
114        }
115    }};
116}
117
118#[macro_export]
119macro_rules! check_merk_v0 {
120    ($method:expr, $version:expr) => {{
121        const EXPECTED_VERSION: u16 = 0;
122        if $version != EXPECTED_VERSION {
123            return Err($crate::error::GroveVersionError::UnknownVersionMismatch {
124                method: $method.to_string(),
125                known_versions: vec![EXPECTED_VERSION],
126                received: $version,
127            }
128            .into());
129        }
130    }};
131}
132
133pub trait TryFromVersioned<T>: Sized {
134    /// The type returned in the event of a conversion error.
135    type Error;
136
137    /// Performs the conversion.
138    fn try_from_versioned(value: T, grove_version: &GroveVersion) -> Result<Self, Self::Error>;
139}
140
141pub trait TryIntoVersioned<T>: Sized {
142    /// The type returned in the event of a conversion error.
143    type Error;
144
145    /// Performs the conversion.
146    fn try_into_versioned(self, grove_version: &GroveVersion) -> Result<T, Self::Error>;
147}
148
149impl<T, U> TryIntoVersioned<U> for T
150where
151    U: TryFromVersioned<T>,
152{
153    type Error = U::Error;
154
155    #[inline]
156    fn try_into_versioned(self, grove_version: &GroveVersion) -> Result<U, U::Error> {
157        U::try_from_versioned(self, grove_version)
158    }
159}
160
161impl<T, U> TryFromVersioned<U> for T
162where
163    T: TryFrom<U>,
164{
165    type Error = T::Error;
166
167    #[inline]
168    fn try_from_versioned(value: U, _grove_version: &GroveVersion) -> Result<Self, Self::Error> {
169        T::try_from(value)
170    }
171}
172
173#[cfg(test)]
174mod tests;