use crate::{
self as behaviortree, Decorator,
behavior::{Behavior, BehaviorData, BehaviorError, BehaviorResult, BehaviorState},
tree::BehaviorTreeElementList,
};
use alloc::boxed::Box;
use tinyscript::SharedRuntime;
#[derive(Decorator, Default)]
#[behavior(groot2)]
pub struct Inverter;
#[async_trait::async_trait]
impl Behavior for Inverter {
async fn tick(
&mut self,
_behavior: &mut BehaviorData,
children: &mut BehaviorTreeElementList,
runtime: &SharedRuntime,
) -> BehaviorResult {
let child = &mut children[0];
let new_state = child.tick(runtime).await?;
match new_state {
BehaviorState::Failure => {
children.halt(runtime)?;
Ok(BehaviorState::Success)
}
BehaviorState::Idle => Err(BehaviorError::State {
behavior: "Inverter".into(),
state: new_state,
}),
state @ (BehaviorState::Running | BehaviorState::Skipped) => Ok(state),
BehaviorState::Success => {
children.halt(runtime)?;
Ok(BehaviorState::Failure)
}
}
}
}