use std::fmt::Debug;
use crate::sql::Prefix;
use crate::sql::Table;
pub trait Field: Debug + Clone + PartialEq + Eq {
type TableType: Table;
fn sql_safe_field_name(&self) -> &str;
fn table(&self) -> &Self::TableType;
fn sql_safe_full_field_name(&self) -> String {
format!(
"{}.{}",
self.table().sql_safe_table_name(),
self.sql_safe_field_name()
)
}
fn sql_safe_prefixed_field_name(&self, prefix: &Prefix) -> String {
let table_name = self.table().sql_safe_table_name();
if let Some((database, table_name)) = table_name.split_once(".") {
format!(
"{database}.{prefix}{table_name}.{}",
self.sql_safe_field_name()
)
} else {
format!("{prefix}{table_name}.{}", self.sql_safe_field_name())
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::sql::example_schema::ExampleSchema;
#[test]
fn test_prefixing() {
let example_prefix = Prefix::new("epfx_".to_string());
assert_eq!(
ExampleSchema::FileName.sql_safe_full_field_name(),
"files.name"
);
assert_eq!(
ExampleSchema::TempKeyValueCacheKey.sql_safe_full_field_name(),
"temp.key_value_cache.key"
);
assert_eq!(
ExampleSchema::FileName.sql_safe_prefixed_field_name(&example_prefix),
"epfx_files.name"
);
assert_eq!(
ExampleSchema::TempKeyValueCacheKey.sql_safe_prefixed_field_name(&example_prefix),
"temp.epfx_key_value_cache.key"
);
}
}