use syn::{Ident, IntTy, Lit};
use codegen::snakize;
use quote;
pub fn is_small(type_: &str) -> bool {
match type_ {
"usize" | "u64" | "u32" | "u16" | "u8" | "i64" | "i32" | "i16" | "i8" | "bool" => true,
_ => false,
}
}
pub fn load(type_: &str, index: usize) -> quote::Tokens {
let index_lit = Lit::Int(index as u64, IntTy::Usize);
if type_ == "bool" {
quote! {
tuple[#index_lit] == 1
}
} else if is_small(type_) {
let out_type = Ident::new(type_.to_string());
quote! {
tuple[#index_lit] as #out_type
}
} else {
let data_name = name(type_);
let index_lit = Lit::Int(index as u64, IntTy::Usize);
quote! {
&db.#data_name[tuple[#index_lit]]
}
}
}
pub fn store(type_: &str, expr: "e::Tokens) -> quote::Tokens {
if is_small(type_) {
quote! {
#expr as usize
}
} else {
let data_name = name(type_);
quote! {
db.#data_name.insert(#expr)
}
}
}
pub fn name(type_: &str) -> Ident {
Ident::new(format!("data_{}", snakize(type_)))
}
pub fn const_name(const_name: &str) -> Ident {
Ident::new(format!("k_{}", snakize(const_name)))
}