use std::sync::Arc;
use hyphae::{Definite, Materialize};
use serde::{Serialize, de::DeserializeOwned};
use crate::{
common::to_value::ToValue,
core::capability::{
GraphQuerying, PeerAccess, Querying, RegistryScoped, Replaying, Reporting, RequestScoped,
Searching, ServerScoped, Viewing,
},
request::RequestContext,
server::MykoServerContext,
store::StoreRegistry,
};
#[derive(Clone)]
pub struct ReportContext {
pub req: Arc<RequestContext>,
pub(crate) store_registry: Arc<StoreRegistry>,
server_ctx: Arc<MykoServerContext>,
}
impl ReportContext {
#[must_use]
pub fn new(req: Arc<RequestContext>, server_ctx: Arc<MykoServerContext>) -> Self {
let store_registry = server_ctx.registry.clone();
Self {
req,
store_registry,
server_ctx,
}
}
}
impl crate::core::capability::sealed::Sealed for ReportContext {}
impl RequestScoped for ReportContext {
fn __request(&self) -> &Arc<RequestContext> {
&self.req
}
}
impl RegistryScoped for ReportContext {
fn __registry(&self) -> &Arc<StoreRegistry> {
&self.store_registry
}
}
impl ServerScoped for ReportContext {
fn __server_ctx(&self) -> &Arc<MykoServerContext> {
&self.server_ctx
}
}
impl Querying for ReportContext {}
impl GraphQuerying for ReportContext {}
impl Searching for ReportContext {}
impl Reporting for ReportContext {}
impl Viewing for ReportContext {}
impl PeerAccess for ReportContext {}
impl crate::core::capability::HistoryReading for ReportContext {
fn __history_replay(&self) -> Option<&Arc<dyn crate::server::HistoryReplayProvider>> {
self.server_ctx.history_replay()
}
}
impl Replaying for ReportContext {}
pub trait ReportHandler: Sized {
type Output: Serialize
+ DeserializeOwned
+ Clone
+ std::fmt::Debug
+ PartialEq
+ Send
+ Sync
+ ToValue
+ 'static;
#[allow(clippy::as_conversions, clippy::unreachable)]
fn compute(&self, _ctx: ReportContext) -> impl Materialize<Arc<Self::Output>, Definite> {
unreachable!("report handlers execute on the server")
as hyphae::Cell<Arc<Self::Output>, hyphae::CellImmutable>
}
}