use super::{ExecuteError, Result};
use super::tag_task::{TaskState, TaskStatus};
use super::tags::{Container, StaticPolicy, StaticPolicyMonoInput, StaticPolicyMonoResult};
use crate::ast2::CommandKind;
pub struct DonePolicy;
impl StaticPolicy for DonePolicy {
fn mono(inputs: StaticPolicyMonoInput) -> Result<StaticPolicyMonoResult> {
let (mut result, residual) = StaticPolicyMonoResult::from_inputs(inputs);
tracing::debug!("tag_done::DonePolicy: {:?}", residual);
let tag = match residual.container {
Container::Tag(tag) => tag,
Container::BeginAnchor(anchor, _) | Container::EndAnchor(anchor, _) => {
return Err(ExecuteError::DoneTagAsAnchor {
range: anchor.range,
});
}
};
match result.collector.latest_task() {
Some(anchor) => match anchor.command {
CommandKind::Task => {
let mut task_state = residual
.worker
.load_state::<TaskState>(anchor.command, &anchor.uuid)?;
match task_state.status {
TaskStatus::Waiting => {
if !residual.readonly {
task_state.status = TaskStatus::Eating;
task_state.eating_end = tag.range.begin;
residual.worker.save_state::<TaskState>(
anchor.command,
&anchor.uuid,
&task_state,
None,
)?;
result.new_patches = vec![(tag.range, String::new())];
}
result.do_next_pass = true;
}
_ => {}
}
}
_ => {
return Err(ExecuteError::DoneTagOutsideTask { range: tag.range });
}
},
None => {
return Err(ExecuteError::DoneTagOutsideTask { range: tag.range });
}
}
tracing::debug!("tag_done res {:?}", result);
Ok(result)
}
}