use crate::version::GroveVersion;
pub mod error;
pub mod version;
#[macro_export]
macro_rules! check_grovedb_v0_with_cost {
    ($method:expr, $version:expr) => {{
        const EXPECTED_VERSION: u16 = 0;
        if $version != EXPECTED_VERSION {
            return Err(GroveVersionError::UnknownVersionMismatch {
                method: $method.to_string(),
                known_versions: vec![EXPECTED_VERSION],
                received: $version,
            }
            .into())
            .wrap_with_cost(OperationCost::default());
        }
    }};
}
#[macro_export]
macro_rules! check_grovedb_v0 {
    ($method:expr, $version:expr) => {{
        const EXPECTED_VERSION: u16 = 0;
        if $version != EXPECTED_VERSION {
            return Err(GroveVersionError::UnknownVersionMismatch {
                method: $method.to_string(),
                known_versions: vec![EXPECTED_VERSION],
                received: $version,
            }
            .into());
        }
    }};
}
#[macro_export]
macro_rules! check_merk_v0_with_cost {
    ($method:expr, $version:expr) => {{
        const EXPECTED_VERSION: u16 = 0;
        if $version != EXPECTED_VERSION {
            return Err(GroveVersionError::UnknownVersionMismatch {
                method: $method.to_string(),
                known_versions: vec![EXPECTED_VERSION],
                received: $version,
            }
            .into())
            .wrap_with_cost(OperationCost::default());
        }
    }};
}
#[macro_export]
macro_rules! check_merk_v0 {
    ($method:expr, $version:expr) => {{
        const EXPECTED_VERSION: u16 = 0;
        if $version != EXPECTED_VERSION {
            return Err(GroveVersionError::UnknownVersionMismatch {
                method: $method.to_string(),
                known_versions: vec![EXPECTED_VERSION],
                received: $version,
            }
            .into());
        }
    }};
}
pub trait TryFromVersioned<T>: Sized {
    type Error;
    fn try_from_versioned(value: T, grove_version: &GroveVersion) -> Result<Self, Self::Error>;
}
pub trait TryIntoVersioned<T>: Sized {
    type Error;
    fn try_into_versioned(self, grove_version: &GroveVersion) -> Result<T, Self::Error>;
}
impl<T, U> TryIntoVersioned<U> for T
where
    U: TryFromVersioned<T>,
{
    type Error = U::Error;
    #[inline]
    fn try_into_versioned(self, grove_version: &GroveVersion) -> Result<U, U::Error> {
        U::try_from_versioned(self, grove_version)
    }
}
impl<T, U> TryFromVersioned<U> for T
where
    T: TryFrom<U>,
{
    type Error = T::Error;
    #[inline]
    fn try_from_versioned(value: U, _grove_version: &GroveVersion) -> Result<Self, Self::Error> {
        T::try_from(value)
    }
}