memtable-macros 0.2.0

Macro library that provides ability to derive typed tables and generate tables compile-time.
use super::{TableColumn, TableMode};
use syn::{parse_quote, Generics, Ident, ItemImpl, Path, Type};

pub struct Args<'a> {
    pub root: &'a Path,
    pub mode: TableMode,
    pub table_name: &'a Ident,
    pub generics: &'a Generics,
    pub table_data_name: &'a Ident,
    pub columns: &'a [&'a TableColumn],
}

pub fn make(args: Args) -> ItemImpl {
    let Args {
        root,
        mode,
        table_name,
        generics,
        table_data_name,
        columns,
    } = args;

    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
    let cols = columns.len();

    let row_t: Type = match mode {
        TableMode::Dynamic => {
            parse_quote!(#root::list::DynamicList<Self::Data>)
        }
        TableMode::Fixed { .. } | TableMode::FixedColumn => {
            parse_quote!(#root::list::FixedList<Self::Data, #cols>)
        }
    };
    let col_t: Type = match mode {
        TableMode::Dynamic | TableMode::FixedColumn => {
            parse_quote!(#root::list::DynamicList<Self::Data>)
        }
        TableMode::Fixed { rows } => parse_quote!(#root::list::FixedList<Self::Data, #rows>),
    };

    parse_quote! {
        impl #impl_generics #root::Table for #table_name #ty_generics #where_clause {
            type Data = #table_data_name #ty_generics;
            type Row = #row_t;
            type Column = #col_t;

            fn max_row_capacity(&self) -> #root::Capacity {
                #root::Table::max_row_capacity(&self.0)
            }

            fn max_column_capacity(&self) -> #root::Capacity {
                #root::Table::max_column_capacity(&self.0)
            }

            fn row_cnt(&self) -> ::core::primitive::usize {
                #root::Table::row_cnt(&self.0)
            }

            fn col_cnt(&self) -> ::core::primitive::usize {
                #root::Table::col_cnt(&self.0)
            }

            fn cell(
                &self,
                row: ::core::primitive::usize,
                col: ::core::primitive::usize,
            ) -> ::core::option::Option<&Self::Data> {
                #root::Table::cell(&self.0, row, col)
            }

            fn mut_cell(
                &mut self,
                row: ::core::primitive::usize,
                col: ::core::primitive::usize,
            ) -> ::core::option::Option<&mut Self::Data> {
                #root::Table::mut_cell(&mut self.0, row, col)
            }

            fn insert_cell(
                &mut self,
                row: ::core::primitive::usize,
                col: ::core::primitive::usize,
                value: Self::Data,
            ) -> ::core::option::Option<Self::Data> {
                #root::Table::insert_cell(&mut self.0, row, col, value)
            }

            fn remove_cell(
                &mut self,
                row: ::core::primitive::usize,
                col: ::core::primitive::usize,
            ) -> ::core::option::Option<Self::Data> {
                #root::Table::remove_cell(&mut self.0, row, col)
            }

            fn set_preferred_row_cnt(&mut self, capacity: ::core::primitive::usize) {
                #root::Table::set_preferred_row_cnt(&mut self.0, capacity);
            }

            fn set_preferred_col_cnt(&mut self, capacity: ::core::primitive::usize) {
                #root::Table::set_preferred_col_cnt(&mut self.0, capacity);
            }
        }
    }
}