use syn::{
punctuated::Punctuated,
token::{Comma, PathSep},
AngleBracketedGenericArguments, GenericArgument, Ident, Lifetime, Path, PathArguments,
PathSegment, Token, Type, TypePath,
};
use crate::args::{ModelArgs, ModelTableType};
pub(super) struct ModelMeta {
ident: Ident,
name: String,
table_ty: ModelTableType,
}
impl ModelMeta {
pub(super) fn new(args: ModelArgs) -> Self {
let ident = args.ident;
let name = args.name.unwrap_or_else(|| ident.to_string());
let table_ty = args.table_type.unwrap_or(Default::default());
Self {
ident,
name,
table_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(
"'static",
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.table_ty {
ModelTableType::Table => {
segments.push(PathSegment {
ident: Ident::new("TableDefinition", self.ident.span()),
arguments: table_generics,
});
}
ModelTableType::Multimap => {
segments.push(PathSegment {
ident: Ident::new("MultimapTableDefinition", self.ident.span()),
arguments: table_generics,
});
}
}
Type::Path(TypePath {
qself: None,
path: Path {
leading_colon: None,
segments,
},
})
}
}