use crate::Table;
use proc_macro2::TokenStream;
use quote::quote;
#[derive(Clone, PartialEq, Debug)]
pub struct StructTable {
pub table: Table,
pub struct_name: String,
}
pub struct StructField {
pub json: Option<String>,
pub is_nullable: bool,
pub attributes: TokenStream,
}
pub const DEFAULT_DERIVES: [&str; 3] = ["Debug", "Clone", "PartialEq"];
#[derive(Debug, Clone)]
pub struct TypeMetadata {
pub derives: Vec<String>,
pub attributes: Vec<String>,
}
impl TypeMetadata {
pub fn with_default_values<T: ToString>(derives: &[T]) -> TypeMetadata {
let mut derives = derives.iter().map(|t| t.to_string()).collect::<Vec<_>>();
derives.extend(
DEFAULT_DERIVES
.iter()
.map(|d| d.to_string())
.collect::<Vec<_>>(),
);
TypeMetadata {
derives,
attributes: vec![],
}
}
pub fn add_derives<T: ToString>(&mut self, d: &[T]) {
for derive in d {
self.derives.push(derive.to_string());
}
}
pub fn into_tokenstream(self) -> TokenStream {
let derives = self
.derives
.into_iter()
.map(|a| a.parse().unwrap())
.collect::<Vec<TokenStream>>();
let attributes = self
.attributes
.into_iter()
.map(|a| a.parse().unwrap())
.collect::<Vec<TokenStream>>();
quote! {
#(#attributes)*
#[derive(#(#derives),*)]
}
}
}
pub trait Transformer {
fn log_library(&self) -> String {
"tracing".to_string()
}
fn struct_field(&self, _struct_table: StructTable, _column_name: &str) -> StructField {
StructField {
json: None,
is_nullable: false,
attributes: Default::default(),
}
}
fn struct_metadata(&self, _struct_table: StructTable) -> TypeMetadata {
TypeMetadata::with_default_values(&[
"scylla::FromRow",
"scylla::ValueList",
"scylla_orm_macro::Mirror",
])
}
fn struct_ref_metadata(&self, _struct_table: StructTable) -> TypeMetadata {
TypeMetadata::with_default_values(&["Copy"])
}
fn primary_struct_metadata(&self, _struct_table: StructTable) -> TypeMetadata {
TypeMetadata::with_default_values(&["scylla_orm_macro::PrimaryKey"])
}
fn primary_struct_ref_metadata(&self, _struct_table: StructTable) -> TypeMetadata {
TypeMetadata::with_default_values(&["scylla_orm_macro::PrimaryKey", "Copy"])
}
fn updatable_column_metadata(&self, _struct_table: StructTable) -> TypeMetadata {
TypeMetadata::with_default_values::<&str>(&[])
}
fn updatable_column_ref_metadata(&self, _struct_table: StructTable) -> TypeMetadata {
TypeMetadata::with_default_values::<&str>(&["Copy"])
}
}
pub struct DefaultTransformer;
impl Transformer for DefaultTransformer {}