quokka-admin 0.1.0

An admin panel for quokka
Documentation
use quokka::{
    handler::html::TemplateDataLoader,
    state::{FromState, ProvideState},
};

use crate::{data::AdminDashboardWidget, state::AdminState};

use super::{AdminPageData, AdminPageLoader};

#[derive(Clone, FromState)]
pub struct AdminDashboardPageLoader {
    admin_page_loader: AdminPageLoader,
    #[from_state(
        bounds = "State: ProvideState<AdminState<State>> + 'static",
        builder = ProvideState::<AdminState<_>>::provide(state).dashboard_widgets,
    )]
    dashboard_widgets: Vec<AdminDashboardWidget>,
}

#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct AdminDashboardPageData {
    dashboard_widgets: Vec<AdminDashboardWidget>,
}

impl<S> TemplateDataLoader<S> for AdminDashboardPageLoader
where
    S: ProvideState<AdminPageLoader>,
    S: Send + Sync + Clone + 'static,
{
    type Args = <AdminPageLoader as TemplateDataLoader<S>>::Args;

    type Data = AdminPageData<AdminDashboardPageData>;

    #[tracing::instrument(
        skip_all,
        target = "quokka_admin::service::page_loader::admin_dashboard_page_loader::AdminDashboardPageLoader"
    )]
    async fn load_data(&self, base_params: Self::Args) -> quokka::Result<Self::Data> {
        let base = <AdminPageLoader as TemplateDataLoader<S>>::load_data(
            &self.admin_page_loader,
            base_params,
        )
        .await?;

        Ok(base.page(AdminDashboardPageData {
            dashboard_widgets: self.dashboard_widgets.clone(),
        }))
    }

    #[tracing::instrument(
        skip_all,
        target = "quokka_admin::service::page_loader::admin_dashboard_page_loader::AdminDashboardPageLoader"
    )]
    async fn render_error(&self, error: quokka::Error) -> impl axum::response::IntoResponse {
        <AdminPageLoader as TemplateDataLoader<S>>::render_error(&self.admin_page_loader, error)
            .await
    }
}