use crate::blueprint::conversions::raw_callable2registered_callable;
use crate::blueprint::reflection::RawCallable;
use crate::blueprint::Blueprint;
use pavex_bp_schema::{Blueprint as BlueprintSchema, Callable, Component};
pub struct RegisteredFallback<'a> {
pub(crate) blueprint: &'a mut BlueprintSchema,
pub(crate) component_id: usize,
}
impl<'a> RegisteredFallback<'a> {
#[track_caller]
pub fn error_handler(mut self, error_handler: RawCallable) -> Self {
let callable = raw_callable2registered_callable(error_handler);
self.fallback().error_handler = Some(callable);
self
}
fn fallback(&mut self) -> &mut pavex_bp_schema::Fallback {
let component = &mut self.blueprint.components[self.component_id];
let Component::FallbackRequestHandler(fallback) = component else {
unreachable!("The component should be a fallback request handler")
};
fallback
}
}
#[derive(Clone, Debug)]
pub struct Fallback {
pub(in crate::blueprint) callable: Callable,
pub(in crate::blueprint) error_handler: Option<Callable>,
}
impl Fallback {
#[track_caller]
pub fn new(callable: RawCallable) -> Self {
Self {
callable: raw_callable2registered_callable(callable),
error_handler: None,
}
}
#[track_caller]
pub fn error_handler(mut self, error_handler: RawCallable) -> Self {
self.error_handler = Some(raw_callable2registered_callable(error_handler));
self
}
pub fn register(self, bp: &mut Blueprint) -> RegisteredFallback {
bp.register_fallback(self)
}
}