use crate::{AnyOutput, ChainProcess, Dispatcher, Node}; /// Marker: Dispatcher Not Found /// /// If a Dispatcher outputs NoDispatcherFound to the Chain, /// the program will terminate directly. /// /// You can implement Renderer for NoDispatcherFound /// to render relevant information when a Dispatcher cannot be found. #[cfg_attr(feature = "general_renderer", derive(serde::Serialize))] pub struct NoDispatcherFound { pub args: Vec, } #[derive(Default)] #[cfg_attr(feature = "general_renderer", derive(serde::Serialize))] pub struct DispatcherNotFound; impl Dispatcher for DispatcherNotFound { fn node(&self) -> crate::Node { Node::default().join("_not_found") } fn begin(&self, args: Vec) -> ChainProcess { AnyOutput::new(NoDispatcherFound { args }).route_renderer() } fn clone_dispatcher(&self) -> Box { Box::new(DispatcherNotFound) } } /// Marker: Renderer Not Found /// /// If a Chain outputs NoRendererFound to the Chain, /// the program will terminate directly. /// /// You can implement Renderer for NoRendererFound /// to render relevant information when a Renderer cannot be found. #[cfg_attr(feature = "general_renderer", derive(serde::Serialize))] pub struct NoRendererFound { pub type_to_render: String, } #[derive(Default)] #[cfg_attr(feature = "general_renderer", derive(serde::Serialize))] pub struct RendererNotFound; impl Dispatcher for RendererNotFound { fn node(&self) -> crate::Node { Node::default().join("_not_found") } fn begin(&self, args: Vec) -> ChainProcess { AnyOutput::new(NoRendererFound { type_to_render: args.first().unwrap().clone(), }) .route_renderer() } fn clone_dispatcher(&self) -> Box { Box::new(RendererNotFound) } }