use std::sync::Arc;
use vantage_core::{Result, error};
use crate::{SpecResolver, VistaFactory, VistaResolver, VistaSpec};
type FactorySpec<F> = VistaSpec<
<F as VistaFactory>::TableExtras,
<F as VistaFactory>::ColumnExtras,
<F as VistaFactory>::ReferenceExtras,
>;
pub fn script_tables<F: VistaFactory>(
factory: F,
specs: Option<Arc<dyn SpecResolver<FactorySpec<F>>>>,
bare: Option<fn(&str) -> FactorySpec<F>>,
) -> Arc<dyn VistaResolver> {
Arc::new(move |name: &str| factory.build_from_spec(script_spec(specs.as_deref(), bare, name)?))
}
fn script_spec<S>(
specs: Option<&dyn SpecResolver<S>>,
bare: Option<fn(&str) -> S>,
name: &str,
) -> Result<S> {
match (specs, bare) {
(Some(specs), _) => specs
.resolve(name)
.ok_or_else(|| error!("script table(): unknown table", table = name).mark_not_found()),
(None, Some(bare)) => Ok(bare(name)),
(None, None) => Err(error!(
"script table() requires a spec resolver on the factory"
)),
}
}