pub mod config;
pub mod handlers;
pub mod routes;
pub mod slots;
use frunk::{HCons, HNil, hlist::HList};
use crate::plugin_install::define_plugin_install;
use crate::{
app::App,
capability::{CapStore, define_passthrough_cap},
components::set_document_title,
config::{ConfigCap, ConfigTag},
hooks::AttachState,
traits::{
add::{AddCapability, CapTagAbsent},
get::{GetByCapTag, GetByTag},
},
};
use config::{PwaConfig, PwaConfigTag};
pub struct PwaTag;
define_passthrough_cap!(PwaStateCap, PwaTag, PwaConfig);
define_plugin_install! {
plugin: PwaTag;
steps: [
templates(slots::Hook),
slots(slots::SlotsHook),
config(PwaConfigTag, PwaConfig),
http(routes::Hook),
state(StateHook),
]
}
#[derive(Clone, Copy, Default)]
pub struct StateHook;
impl<L, CfgIdx, Configs, PwaCfgIdx, TagProof> AttachState<L, (CfgIdx, Configs, PwaCfgIdx, TagProof)>
for StateHook
where
L: GetByCapTag<ConfigTag, CfgIdx, Value = ConfigCap<HNil, Configs>>,
Configs: GetByTag<PwaConfigTag, PwaCfgIdx, Value = PwaConfig>,
L: HList + CapTagAbsent<PwaTag, TagProof>,
{
type Output = HCons<PwaStateCap, L>;
fn attach_state(app: App<L>) -> App<Self::Output> {
let config = <Configs as GetByTag<PwaConfigTag, PwaCfgIdx>>::get_by_tag(
&app.get_capability::<ConfigTag, CfgIdx>().items,
)
.clone();
if !config.app_name.is_empty() {
set_document_title(config.app_name.clone());
}
app.add_capability(CapStore::with_items(config))
}
}