#![expect(
dead_code,
reason = "由后续 ProcessorTemplateHandler 的待处理队列创建并消费"
)]
use std::cell::RefCell;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use super::i_engine_processable::EngineProcessableResult;
use super::model::Model;
use super::template_flow_controller::TemplateFlowController;
use super::{IEngineProcessable, ITemplateHandler};
pub(crate) struct SimpleModelProcessable {
model: Rc<RefCell<Model>>,
model_handler: Rc<RefCell<Box<dyn ITemplateHandler>>>,
flow_controller: Arc<Mutex<TemplateFlowController>>,
offset: usize,
}
impl SimpleModelProcessable {
pub(crate) fn new(
model: Rc<RefCell<Model>>,
model_handler: Rc<RefCell<Box<dyn ITemplateHandler>>>,
flow_controller: Arc<Mutex<TemplateFlowController>>,
) -> Self {
Self {
model,
model_handler,
flow_controller,
offset: 0,
}
}
pub(crate) fn get_model_handler(&self) -> Rc<RefCell<Box<dyn ITemplateHandler>>> {
Rc::clone(&self.model_handler)
}
pub(crate) fn get_model(&self) -> Rc<RefCell<Model>> {
Rc::clone(&self.model)
}
}
impl IEngineProcessable for SimpleModelProcessable {
fn process(&mut self) -> EngineProcessableResult {
if self
.flow_controller
.lock()
.expect("template flow controller lock poisoned")
.stop_processing
{
return Ok(false);
}
let processed = {
self.model.borrow().process_throttled(
self.model_handler.borrow_mut().as_mut(),
self.offset,
Some(&self.flow_controller),
)?
};
self.offset += processed;
Ok(self.offset == self.model.borrow().queue.len()
&& !self
.flow_controller
.lock()
.expect("template flow controller lock poisoned")
.stop_processing)
}
}