use crate::{
errors::*,
make_async_trait,
state::{BuildPaths, MakeRx, StateGeneratorInfo, TemplateState, UnknownStateType},
utils::AsyncFnReturn,
Request,
};
use futures::Future;
use http::HeaderMap;
use serde::{de::DeserializeOwned, Serialize};
use sycamore::{prelude::Scope, view::View, web::SsrNode};
#[derive(Debug)]
pub enum GeneratorResult<T> {
Ok(T),
Err(Box<dyn std::error::Error + Send + Sync>),
}
impl<T> GeneratorResult<T> {
pub(crate) fn into_server_result(
self,
fn_name: &str,
template_name: String,
) -> Result<T, ServerError> {
match self {
Self::Ok(val) => Ok(val),
Self::Err(err) => Err(ServerError::RenderFnFailed {
fn_name: fn_name.to_string(),
template_name,
blame: ErrorBlame::Server(None),
source: err,
}),
}
}
}
#[derive(Debug)]
pub enum BlamedGeneratorResult<T> {
Ok(T),
Err(GenericBlamedError),
}
impl<T> BlamedGeneratorResult<T> {
pub(crate) fn into_server_result(
self,
fn_name: &str,
template_name: String,
) -> Result<T, ServerError> {
match self {
Self::Ok(val) => Ok(val),
Self::Err(err) => Err(ServerError::RenderFnFailed {
fn_name: fn_name.to_string(),
template_name,
blame: err.blame,
source: err.error,
}),
}
}
}
impl From<BuildPaths> for GeneratorResult<BuildPaths> {
fn from(val: BuildPaths) -> Self {
Self::Ok(val)
}
}
impl<E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + Send + Sync>
From<Result<BuildPaths, E>> for GeneratorResult<BuildPaths>
{
fn from(val: Result<BuildPaths, E>) -> Self {
match val {
Ok(val) => Self::Ok(val),
Err(err) => Self::Err(err.into()),
}
}
}
impl<S: Serialize + DeserializeOwned + MakeRx> From<S> for GeneratorResult<S> {
fn from(val: S) -> Self {
Self::Ok(val)
}
}
impl<
S: Serialize + DeserializeOwned + MakeRx,
E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + Send + Sync,
> From<Result<S, E>> for GeneratorResult<S>
{
fn from(val: Result<S, E>) -> Self {
match val {
Ok(val) => Self::Ok(val),
Err(err) => Self::Err(err.into()),
}
}
}
impl From<View<SsrNode>> for GeneratorResult<View<SsrNode>> {
fn from(val: View<SsrNode>) -> Self {
Self::Ok(val)
}
}
impl<E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + Send + Sync>
From<Result<View<SsrNode>, E>> for GeneratorResult<View<SsrNode>>
{
fn from(val: Result<View<SsrNode>, E>) -> Self {
match val {
Ok(val) => Self::Ok(val),
Err(err) => Self::Err(err.into()),
}
}
}
impl From<HeaderMap> for GeneratorResult<HeaderMap> {
fn from(val: HeaderMap) -> Self {
Self::Ok(val)
}
}
impl<E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + Send + Sync>
From<Result<HeaderMap, E>> for GeneratorResult<HeaderMap>
{
fn from(val: Result<HeaderMap, E>) -> Self {
match val {
Ok(val) => Self::Ok(val),
Err(err) => Self::Err(err.into()),
}
}
}
impl<S: Serialize + DeserializeOwned + MakeRx> From<S> for BlamedGeneratorResult<S> {
fn from(val: S) -> Self {
Self::Ok(val)
}
}
impl<
S: Serialize + DeserializeOwned + MakeRx,
E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + Send + Sync,
> From<Result<S, BlamedError<E>>> for BlamedGeneratorResult<S>
{
fn from(val: Result<S, BlamedError<E>>) -> Self {
match val {
Ok(val) => Self::Ok(val),
Err(err) => Self::Err(err.into_boxed()),
}
}
}
impl From<bool> for BlamedGeneratorResult<bool> {
fn from(val: bool) -> Self {
Self::Ok(val)
}
}
impl<E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + Send + Sync>
From<Result<bool, BlamedError<E>>> for BlamedGeneratorResult<bool>
{
fn from(val: Result<bool, BlamedError<E>>) -> Self {
match val {
Ok(val) => Self::Ok(val),
Err(err) => Self::Err(err.into_boxed()),
}
}
}
make_async_trait!(
pub(crate) GetBuildPathsFnType,
Result<BuildPaths, ServerError>
);
make_async_trait!(
pub(super) GetBuildStateFnType,
Result<TemplateState, ServerError>,
info: StateGeneratorInfo<UnknownStateType>
);
make_async_trait!(
pub(super) GetRequestStateFnType,
Result<TemplateState, ServerError>,
info: StateGeneratorInfo<UnknownStateType>,
req: Request
);
make_async_trait!(
pub(super) ShouldRevalidateFnType,
Result<bool, ServerError>,
info: StateGeneratorInfo<UnknownStateType>,
req: Request
);
make_async_trait!(
pub(super) AmalgamateStatesFnType,
Result<TemplateState, ServerError>,
info: StateGeneratorInfo<UnknownStateType>,
build_state: TemplateState,
request_state: TemplateState
);
make_async_trait!(
pub GetBuildPathsUserFnType< V: Into< GeneratorResult<BuildPaths> > >,
V
);
make_async_trait!(
pub GetBuildStateUserFnType< S: Serialize + DeserializeOwned + MakeRx, B: Serialize + DeserializeOwned + Send + Sync, V: Into< BlamedGeneratorResult<S> > >,
V,
info: StateGeneratorInfo<B>
);
make_async_trait!(
pub GetRequestStateUserFnType< S: Serialize + DeserializeOwned + MakeRx, B: Serialize + DeserializeOwned + Send + Sync, V: Into< BlamedGeneratorResult<S> > >,
V,
info: StateGeneratorInfo<B>,
req: Request
);
make_async_trait!(
pub ShouldRevalidateUserFnType< B: Serialize + DeserializeOwned + Send + Sync, V: Into< BlamedGeneratorResult<bool> > >,
V,
info: StateGeneratorInfo<B>,
req: Request
);
make_async_trait!(
pub AmalgamateStatesUserFnType< S: Serialize + DeserializeOwned + MakeRx, B: Serialize + DeserializeOwned + Send + Sync, V: Into< BlamedGeneratorResult<S> > >,
V,
info: StateGeneratorInfo<B>,
build_state: S,
request_state: S
);
pub(crate) type HeadFn =
Box<dyn Fn(Scope, TemplateState) -> Result<View<SsrNode>, ServerError> + Send + Sync>;
pub(crate) type SetHeadersFn =
Box<dyn Fn(Scope, TemplateState) -> Result<HeaderMap, ServerError> + Send + Sync>;
pub(crate) type GetBuildPathsFn = Box<dyn GetBuildPathsFnType + Send + Sync>;
pub(crate) type GetBuildStateFn = Box<dyn GetBuildStateFnType + Send + Sync>;
pub(crate) type GetRequestStateFn = Box<dyn GetRequestStateFnType + Send + Sync>;
pub(crate) type ShouldRevalidateFn = Box<dyn ShouldRevalidateFnType + Send + Sync>;
pub(crate) type AmalgamateStatesFn = Box<dyn AmalgamateStatesFnType + Send + Sync>;