use axum::response::Response;
use std::collections::HashSet;
use std::marker::PhantomData;
use std::sync::Arc;
use crate::HumusQuerySettings;
use crate::HumusView;
use crate::language::LanguageEngine;
use crate::middleware::TemplateSettingsLayer;
use crate::templating::{
FormatChooser, HumusApiFormat, HumusFormatIdentifier, TemplatesManifest, TemplatingEngine,
};
#[allow(clippy::doc_overindented_list_items)]
#[derive(Debug, Clone)]
pub struct HumusEngine<ApiFormat>
where
ApiFormat: HumusApiFormat,
{
pub templating_engine: TemplatingEngine<ApiFormat>,
pub language_engine: Arc<LanguageEngine>,
phantom_format: PhantomData<ApiFormat>,
}
impl<ApiFormat> HumusEngine<ApiFormat>
where
ApiFormat: HumusApiFormat,
{
pub fn new(
templating_engine: TemplatingEngine<ApiFormat>,
language_engine: Arc<LanguageEngine>,
) -> Self {
Self {
templating_engine,
language_engine,
phantom_format: PhantomData,
}
}
pub fn render_view<S: HumusQuerySettings>(
&self,
settings: &S,
view: impl HumusView<S, ApiFormat>,
) -> Response {
self.templating_engine
.render_view(settings, view, &self.language_engine)
}
pub fn language_engine(&self) -> &LanguageEngine {
&self.language_engine
}
#[inline]
pub fn templates_manifest(&self) -> &TemplatesManifest {
&self.templating_engine.templates_manifest
}
pub fn list_available_formats(&self) -> HashSet<HumusFormatIdentifier> {
let mut set: HashSet<HumusFormatIdentifier> = ApiFormat::get_all()
.into_iter()
.map(|f| f.get_name())
.collect();
for identifier in self.templates_manifest().format.keys() {
set.insert(*identifier);
}
set
}
pub fn get_format_chooser(&self) -> FormatChooser {
FormatChooser::new::<ApiFormat>(self.templates_manifest())
}
pub fn get_template_settings_layer(&self) -> TemplateSettingsLayer {
TemplateSettingsLayer::new(
self.templates_manifest().clone(),
self.language_engine.language_manifest().clone(),
self.get_format_chooser(),
)
}
}