use syn::{
punctuated::Punctuated,
token::{Comma, PathSep},
AngleBracketedGenericArguments, GenericArgument, Ident, Lifetime, Path, PathArguments,
PathSegment, Token, Type, TypePath,
};
use crate::args::ModelTableType;
pub(super) struct TableMetadata {
ident: Ident,
name: String,
ty: ModelTableType,
}
impl TableMetadata {
pub(super) fn new(ident: Ident, name: String, ty: ModelTableType) -> Self {
Self { ident, name, ty }
}
pub(super) fn ident(&self) -> &Ident {
&self.ident
}
pub(super) fn name(&self) -> &str {
&self.name
}
pub(crate) fn redb_ty(&self, k: &Type, v: &Type) -> Type {
let mut args: Punctuated<_, Comma> = Punctuated::new();
args.push(GenericArgument::Lifetime(Lifetime::new(
"'a",
self.ident.span(),
)));
args.push(GenericArgument::Type(k.clone()));
args.push(GenericArgument::Type(v.clone()));
let table_generics = PathArguments::AngleBracketed(AngleBracketedGenericArguments {
colon2_token: None,
lt_token: Token),
args,
gt_token: Token),
});
let mut segments: Punctuated<PathSegment, PathSep> = Punctuated::new();
segments.push(PathSegment {
ident: Ident::new("redb", self.ident.span()),
arguments: syn::PathArguments::None,
});
match self.ty {
ModelTableType::Table => {
segments.push(PathSegment {
ident: Ident::new("TableDefinition", self.ident.span()),
arguments: table_generics,
});
}
ModelTableType::MultimapTable => {
segments.push(PathSegment {
ident: Ident::new("MultimapTableDefinition", self.ident.span()),
arguments: table_generics,
});
}
}
Type::Path(TypePath {
qself: None,
path: Path {
leading_colon: None,
segments,
},
})
}
}