worktable_macros 0.9.0

Proc-macro companion crate for worktable: the worktable! macro and its derives. Formerly published as worktable_codegen.
Documentation
use crate::common::name_generator::WorktableNameGenerator;
use crate::generators::in_memory::InMemoryGenerator;
use proc_macro2::TokenStream;
use quote::quote;

impl InMemoryGenerator {
    pub fn gen_wrapper_def(&self) -> TokenStream {
        let type_ = self.gen_wrapper_type();
        let impl_ = self.gen_wrapper_impl();
        let storable_impl = self.get_wrapper_storable_impl();
        let archived_wrapper_impl = self.get_archived_wrapper_impl();

        quote! {
            #type_
            #impl_
            #storable_impl
            #archived_wrapper_impl
        }
    }

    fn gen_wrapper_type(&self) -> TokenStream {
        let name_generator = WorktableNameGenerator::from_table_name(self.name.to_string());
        let row_ident = name_generator.get_row_type_ident();
        let wrapper_ident = name_generator.get_wrapper_type_ident();

        quote! {
            #[derive(rkyv::Archive, Debug, rkyv::Deserialize, rkyv::Serialize)]
            #[repr(C)]
            pub struct #wrapper_ident {
                inner: #row_ident,
                is_ghosted: bool,
                is_deleted: bool,
                is_in_vacuum_process: bool,
            }
        }
    }

    pub fn gen_wrapper_impl(&self) -> TokenStream {
        let name_generator = WorktableNameGenerator::from_table_name(self.name.to_string());
        let wrapper_ident = name_generator.get_wrapper_type_ident();
        let row_ident = name_generator.get_row_type_ident();

        quote! {

            impl RowWrapper<#row_ident> for #wrapper_ident {
                fn get_inner(self) -> #row_ident {
                    self.inner
                }

                fn is_ghosted(&self) -> bool {
                    self.is_ghosted
                }

                fn is_vacuumed(&self) -> bool {
                    self.is_in_vacuum_process
                }

                fn is_deleted(&self) -> bool {
                    self.is_deleted
                }

                fn from_inner(inner: #row_ident) -> Self {
                    Self {
                        inner,
                        is_ghosted: true,
                        is_deleted: false,
                        is_in_vacuum_process: false,
                    }
                }
            }
        }
    }

    fn get_wrapper_storable_impl(&self) -> TokenStream {
        let name_generator = WorktableNameGenerator::from_table_name(self.name.to_string());
        let row_ident = name_generator.get_row_type_ident();
        let wrapper_ident = name_generator.get_wrapper_type_ident();

        quote! {
            impl StorableRow for #row_ident {
                type WrappedRow = #wrapper_ident;
            }
        }
    }

    fn get_archived_wrapper_impl(&self) -> TokenStream {
        let name_generator = WorktableNameGenerator::from_table_name(self.name.to_string());
        let row_ident = name_generator.get_archived_wrapper_type_ident();

        quote! {
            impl ArchivedRowWrapper for #row_ident {
                fn unghost(&mut self) {
                    self.is_ghosted = false;
                }
                fn set_in_vacuum_process(&mut self) {
                    self.is_in_vacuum_process = true;
                }
                fn delete(&mut self) {
                    self.is_deleted = true;
                }
                fn is_deleted(&self) -> bool {
                    self.is_deleted
                }
            }
        }
    }
}