korvin-core 0.2.1

The core for korvin frontend framework
Documentation
#[macro_export]
macro_rules! impl_complex_mutation {
    (mutation = $mutation:ty, log = $log:ty, reverse = $reverse:ty, $perform:item, $revert:item) => {
        pub type Mutation = $mutation;
        pub type Log = $log;

        impl $crate::mutation::traits::Perform for $mutation {
            type Log = $log;
            fn to_mutation(self) -> $crate::mutation::Mutation {
                $crate::mutation::traits::Perform::to_mutation(super::Mutation::from(self))
            }
            $perform
        }

        impl $crate::mutation::traits::Revert for $log {
            type Mutation = $reverse;
            fn to_mutation_log(self) -> $crate::mutation::MutationLog {
                $crate::mutation::traits::Revert::to_mutation_log(super::Log::from(self))
            }
            $revert
        }
    }
}

#[macro_export]
macro_rules! impl_mutation {
    (mutation = $mutation:ty, log = $log:ty, $perform:item, $revert:item) => {
        $crate::impl_complex_mutation! {
            mutation = $mutation,
            log = $log,
            reverse = $mutation,
            $perform,
            $revert
        }
    };
}

#[macro_export]
macro_rules! impl_complex_mutation_wrapper {
    (
        reverse = $reverse_mutation:ty,
        $(#[$mutation_meta:meta])* enum $mutation:ident {
            $(
                $(#[$mutation_variant_meta:meta])*
                $mutation_variant:ident($mutation_inner:ty)
            ),* $(,)?
        },
        $(#[$log_meta:meta])* enum $mutation_log:ident {
            $(
                $(#[$log_variant_meta:meta])*
                $log_variant:ident($log_inner:ty)
            ),* $(,)?
        }
    ) => {
        $(#[$mutation_meta])*
        #[derive(Debug, derive_more::From, PartialEq, Clone)]
        #[derive(derive_more::TryInto)]
        #[try_into(owned, ref, ref_mut)]
        pub enum $mutation {
            $(
                $(#[$mutation_variant_meta])*
                $mutation_variant($mutation_inner)
            ),*
        }

        $(#[$log_meta])*
        #[derive(Debug, derive_more::From, PartialEq, Clone)]
        #[derive(derive_more::TryInto)]
        #[try_into(owned, ref, ref_mut)]
        pub enum $mutation_log{
            $(
                $(#[$log_variant_meta])*
                $log_variant($log_inner)
            ),*
        }

        $crate::impl_complex_mutation! {
            mutation = $mutation,
            log = $mutation_log,
            reverse = $reverse_mutation,
            fn perform(&self, state: $crate::data::ElementId) -> $crate::mutation::error::MutationResult<Self::Log> {
                match self {
                    $(Self::$mutation_variant(inner) => inner.perform(state).map(Into::into)),*
                }
            },
            fn revert(&self) -> Self::Mutation {
                match self {
                    $(Self::$log_variant(inner) => inner.revert().into()),*
                }
            }
        }
    }
}

#[macro_export]
macro_rules! impl_mutation_wrapper {
    (
        $(#[$mutation_meta:meta])* enum $mutation:ident {
            $(
                $(#[$mutation_variant_meta:meta])*
                $mutation_variant:ident($mutation_inner:ty)
            ),* $(,)?
        },
        $(#[$log_meta:meta])* enum $mutation_log:ident {
            $(
                $(#[$log_variant_meta:meta])*
                $log_variant:ident($log_inner:ty)
            ),* $(,)?
        }
    ) => {
        $(#[$mutation_meta])*
        #[derive(Debug, derive_more::From, PartialEq, Clone)]
        pub enum $mutation {
            $(
                $(#[$mutation_variant_meta])*
                $mutation_variant($mutation_inner)
            ),*
        }

        $(#[$log_meta])*
        #[derive(Debug, derive_more::From, PartialEq, Clone)]
        pub enum $mutation_log{
            $(
                $(#[$log_variant_meta])*
                $log_variant($log_inner)
            ),*
        }

        $crate::impl_mutation! {
            mutation = $mutation,
            log = $mutation_log,
            fn perform(&self, state: $crate::data::ElementId) -> $crate::mutation::error::MutationResult<Self::Log> {
                match self {
                    $(Self::$mutation_variant(inner) => inner.perform(state).map(Into::into)),*
                }
            },
            fn revert(&self) -> Self::Mutation {
                match self {
                    $(Self::$log_variant(inner) => inner.revert().into()),*
                }
            }
        }
    }
}