pub struct MiddlewareChain<Evt, ErrState = ErrorsDisabled> { /* private fields */ }Expand description
中间件链——按注册顺序逐层执行。
链中的每一层可以是 inspector 或 mutator,通过构建方法指定。
参数 ErrState 是 typestate 标记,默认 ErrorsDisabled。
§执行模型
- Inspector 层:同一层内的 inspector 通过
tokio::spawn并行执行, 不等待其完成。错误通过 error channel 异步报告。 无 tokio 运行时:降级为同步执行。 - Mutator 层:同一层内的 mutator 按注册顺序依次执行。
遇到
MutatorAction::Block立即终止整条链。
§Typestate 错误通道
// 默认状态:ErrorsDisabled
let chain = MiddlewareChain::<String>::new()
.with_inspector(Insp);
// 激活错误通道后变为 ErrorsEnabled
let (chain, rx) = chain.activate_error_channel();
// chain: MiddlewareChain<String, ErrorsEnabled>Implementations§
Source§impl<Evt: Clone + Send + 'static> MiddlewareChain<Evt, ErrorsDisabled>
impl<Evt: Clone + Send + 'static> MiddlewareChain<Evt, ErrorsDisabled>
Sourcepub fn new() -> Self
pub fn new() -> Self
创建一个新的空中间件链(ErrorsDisabled 状态)。
链初始为空,需要通过 with_inspector、with_mutators 等方法填充。
Sourcepub fn activate_error_channel(
self,
) -> (MiddlewareChain<Evt, ErrorsEnabled>, UnboundedReceiver<(String, InspectorError)>)
pub fn activate_error_channel( self, ) -> (MiddlewareChain<Evt, ErrorsEnabled>, UnboundedReceiver<(String, InspectorError)>)
启用错误通道并获取 receiver。
调用后链的状态变为 ErrorsEnabled,inspector 执行中的错误将通过
返回的 receiver 异步送达。此方法仅可调用一次(编译期由 typestate 保证)。
如果不需要跟踪 inspector 错误,可以忽略返回值中的 receiver。
§示例
let chain = MiddlewareChain::<String>::new()
.with_inspector(Insp);
let (_chain, mut error_rx) = chain.activate_error_channel();Source§impl<Evt: Clone + Send + 'static, S> MiddlewareChain<Evt, S>
impl<Evt: Clone + Send + 'static, S> MiddlewareChain<Evt, S>
Sourcepub fn with_inspector(self, i: impl InspectorMiddleware<Evt> + 'static) -> Self
pub fn with_inspector(self, i: impl InspectorMiddleware<Evt> + 'static) -> Self
添加单个 inspector 作为独立的一层。
每个 with_inspector 调用创建一个新层,与其他层按注册顺序执行。
同一层内的 inspector 通过 tokio::spawn 后台并行。
Sourcepub fn with_inspectors(self, i: impl IntoInspectors<Evt>) -> Self
pub fn with_inspectors(self, i: impl IntoInspectors<Evt>) -> Self
添加一组 inspector 作为同一层(并行)。
接受 Bevy 风格的 tuple (A, B, C),所有 inspector 将在同一层内并行执行。
§示例
let chain = MiddlewareChain::<String>::new()
.with_inspectors((A, B)); // A 和 B 并行执行Sourcepub fn with_inspectors_from_iter(
self,
iter: impl IntoIterator<Item = Arc<dyn InspectorMiddleware<Evt>>>,
) -> Self
pub fn with_inspectors_from_iter( self, iter: impl IntoIterator<Item = Arc<dyn InspectorMiddleware<Evt>>>, ) -> Self
从迭代器批量添加已装箱的 inspector。
Sourcepub fn with_mutator(self, m: impl MutatorMiddleware<Evt> + 'static) -> Self
pub fn with_mutator(self, m: impl MutatorMiddleware<Evt> + 'static) -> Self
添加单个 mutator 作为独立的一层。
每个 with_mutator 调用创建一个新层。同一层内的 mutator 按顺序执行。
Sourcepub fn with_mutators(self, m: impl IntoMutators<Evt>) -> Self
pub fn with_mutators(self, m: impl IntoMutators<Evt>) -> Self
添加一组 mutator 作为同一层(顺序执行)。
接受 Bevy 风格的 tuple (A, B, C),所有 mutator 按注册顺序依次执行。
§示例
let chain = MiddlewareChain::<String>::new()
.with_mutators((Censor, Blocker)); // Censor 先,Blocker 后Sourcepub fn with_mutators_from_iter(
self,
iter: impl IntoIterator<Item = Arc<dyn MutatorMiddleware<Evt>>>,
) -> Self
pub fn with_mutators_from_iter( self, iter: impl IntoIterator<Item = Arc<dyn MutatorMiddleware<Evt>>>, ) -> Self
从迭代器批量添加已装箱的 mutator。
Sourcepub fn process(&self, event: Evt) -> Result<Evt, MiddlewareBlocked>
pub fn process(&self, event: Evt) -> Result<Evt, MiddlewareBlocked>
Source§impl<Evt: Clone + Send + 'static> MiddlewareChain<Evt, ErrorsEnabled>
impl<Evt: Clone + Send + 'static> MiddlewareChain<Evt, ErrorsEnabled>
Sourcepub fn error_sender(&self) -> Option<UnboundedSender<(String, InspectorError)>>
pub fn error_sender(&self) -> Option<UnboundedSender<(String, InspectorError)>>
返回底层 error channel 的 sender,可用于外部发送错误。
返回的 sender 是 Option——如果 chain 构造时未激活错误通道则为 None。