mod build;
mod column;
mod data_type;
mod relation;
pub use build::build_catalog;
pub use column::CatalogColumn;
pub use data_type::CatalogType;
pub use relation::{CatalogRelation, RelationKind};
use indexmap::IndexMap;
use crate::error::HolocronError;
use crate::span::Span;
#[derive(Debug, Clone, Default)]
pub struct Catalog {
relations: IndexMap<String, CatalogRelation>,
enums: IndexMap<String, Vec<String>>,
relation_spans: IndexMap<String, Span>,
}
impl Catalog {
pub(crate) fn from_enums(enums: IndexMap<String, Vec<String>>) -> Self {
Self {
enums,
relations: IndexMap::new(),
relation_spans: IndexMap::new(),
}
}
pub fn relation(&self, name: &str) -> Option<&CatalogRelation> {
self.relations.get(name)
}
pub fn enum_type(&self, name: &str) -> Option<&[String]> {
self.enums.get(name).map(Vec::as_slice)
}
pub fn relations(&self) -> impl Iterator<Item = &CatalogRelation> {
self.relations.values()
}
pub(crate) fn insert_relation(
&mut self,
relation: CatalogRelation,
name_span: Span,
) -> Result<(), HolocronError> {
let name = relation.name.clone();
if let Some(&first_span) = self.relation_spans.get(&name) {
return Err(HolocronError::duplicate_relation(
name, first_span, name_span,
));
}
self.relation_spans.insert(name.clone(), name_span);
self.relations.insert(name, relation);
Ok(())
}
}