mod changes;
mod infer;
mod loaders;
mod many_to_many;
use std::collections::BTreeMap;
use self::changes::{apply_changes, check_names, location};
use self::infer::record;
use crate::RelationshipChange;
use crate::schema::{Column, Table};
pub use self::changes::check_changes;
pub use self::loaders::{render, resolve};
pub use self::many_to_many::{JoinPair, join_pair};
pub fn infer(tables: &mut [Table], changes: &Changes, scope: Scope) -> Result<(), String> {
record(tables);
let renamed = apply_changes(tables, changes, scope == Scope::Schema)?;
for table in tables.iter() {
check_names(table, &renamed)?;
if scope == Scope::Run {
super::search::check_filter_fields(table, tables).map_err(|message| {
format!(
"{message}; rename the relationship in {}",
location(&table.module_name, None)
)
})?;
}
}
Ok(())
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Scope {
Run,
Schema,
}
pub type Changes = BTreeMap<String, BTreeMap<String, RelationshipChange>>;
fn find_column<'a>(table: &'a Table, name: &str) -> Option<&'a Column> {
table.columns.iter().find(|column| column.sql_name == name)
}