use crate::__perseus_main as main;
use crate::errors::*;
use perseus::internal::build::{build_app, BuildProps};
use perseus::internal::export::{export_app, ExportProps};
use perseus::internal::get_path_prefix_server;
use perseus::{PerseusApp, SsrNode};
pub async fn export() -> Result<(), ExportError> {
let app = main::<SsrNode>();
let plugins = app.get_plugins();
let immutable_store = perseus::stores::ImmutableStore::new(".tribble/perseus".to_string());
let mutable_store =
perseus::stores::FsMutableStore::new(".tribble/perseus/mutable".to_string());
let locales = app.get_locales();
let gsc = app.get_global_state_creator();
let global_state = match gsc.get_build_state().await {
Ok(global_state) => global_state,
Err(err) => {
return Err(ExportError::GscFailed { source: err });
}
};
let templates_map = app.get_templates_map();
let index_view_str = app.get_index_view_str();
let root_id = app.get_root();
let translations_manager = app.get_translations_manager().await;
let build_res = build_app(BuildProps {
templates: &templates_map,
locales: &locales,
immutable_store: &immutable_store,
mutable_store: &mutable_store,
translations_manager: &translations_manager,
global_state: &global_state,
exporting: true,
})
.await;
if let Err(err) = build_res {
return Err(ExportError::BuildFailed { source: err });
}
let index_view =
PerseusApp::get_html_shell(index_view_str, &root_id, &immutable_store, &plugins).await;
let export_res = export_app(ExportProps {
templates: &templates_map,
html_shell: index_view,
locales: &locales,
immutable_store: &immutable_store,
translations_manager: &translations_manager,
path_prefix: get_path_prefix_server(),
global_state: &global_state,
})
.await;
if let Err(err) = export_res {
return Err(ExportError::ExportFailed { source: err });
}
Ok(())
}