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 type Error;
136
137 fn try_from_versioned(value: T, grove_version: &GroveVersion) -> Result<Self, Self::Error>;
139}
140
141pub trait TryIntoVersioned<T>: Sized {
142 type Error;
144
145 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;