use crate::sites_runtime::SiteContext;
use oxipage_core::config::Config;
use oxipage_core::extension::WasmLoader;
use oxipage_core::registry::ExtensionRegistry;
use std::path::PathBuf;
use std::sync::Arc;
pub struct SiteLoader;
impl SiteLoader {
pub async fn load(slug: String, path: PathBuf) -> anyhow::Result<SiteContext> {
let toml_path = path.join("oxipage.toml");
let cfg = Config::load(&toml_path)?;
let data_dir = if cfg.server.data_dir.is_relative() {
path.join(&cfg.server.data_dir)
} else {
cfg.server.data_dir.clone()
};
tokio::fs::create_dir_all(&data_dir).await?;
let db_path = data_dir.join("oxipage.db");
let db = oxipage_core::db::connect(&db_path).await?;
let toml_enabled = cfg.extensions.enabled.clone();
let extensions = crate::all_extensions();
let registry = Arc::new(ExtensionRegistry::new(extensions));
registry.run_migrations(&db, &toml_enabled).await?;
let wasm_loader: Option<Arc<dyn WasmLoader>> = None;
Ok(SiteContext {
slug,
path,
config: Arc::new(cfg),
db,
registry,
builders: Arc::new(crate::all_builders()),
wasm_loader,
})
}
}