worktable_macros 0.9.0

Proc-macro companion crate for worktable: the worktable! macro and its derives. Formerly published as worktable_codegen.
Documentation
use proc_macro2::TokenStream;
use quote::quote;
use syn::parse::{Parse, ParseStream};
use syn::{Ident, Result};

use crate::common::name_generator::WorktableNameGenerator;

struct S3PersistenceInput {
    table_name: Ident,
}

impl Parse for S3PersistenceInput {
    fn parse(input: ParseStream) -> Result<Self> {
        let table_name: Ident = input.parse()?;
        Ok(S3PersistenceInput { table_name })
    }
}

pub fn expand(input: TokenStream) -> Result<TokenStream> {
    let input: S3PersistenceInput = syn::parse2(input)?;

    let name_str = input.table_name.to_string();
    let base_name = name_str.strip_suffix("WorkTable").unwrap_or(&name_str).to_string();

    let generator = WorktableNameGenerator::from_table_name(base_name);

    let output_ident = generator.get_s3_sync_persistence_engine_ident();
    let primary_key = generator.get_primary_key_type_ident();
    let space_secondary_index = generator.get_space_secondary_index_ident();
    let space_secondary_index_events = generator.get_space_secondary_index_events_ident();
    let available_indexes = generator.get_available_indexes_ident();
    let inner_size_const = generator.get_page_inner_size_const_ident();
    let page_size_const = generator.get_page_size_const_ident();

    Ok(quote! {
        pub type #output_ident = S3SyncDiskPersistenceEngine<
            SpaceData<
                <<#primary_key as TablePrimaryKey>::Generator as PrimaryKeyGeneratorState>::State,
                { #inner_size_const },
                { #page_size_const as u32 },
            >,
            SpaceIndex<#primary_key, { #inner_size_const as u32 }>,
            #space_secondary_index,
            #primary_key,
            #space_secondary_index_events,
            #available_indexes,
        >;
    })
}