pub struct SubsumptionNode {
pub layers: Vec<SubsumptionLayer>,
/* private fields */
}Expand description
Priority-based preemption (subsumption architecture): on each tick, tries each layer
highest-priority first. The first layer whose tick() returns Running/Success “wins”;
lower-priority layers aren’t ticked that cycle, preserving their internal progress.
Fields§
§layers: Vec<SubsumptionLayer>Implementations§
Source§impl SubsumptionNode
impl SubsumptionNode
Sourcepub fn new() -> SubsumptionNode
pub fn new() -> SubsumptionNode
Create a new empty subsumption node.
Sourcepub fn add_layer(
self,
priority: u8,
behavior: Box<dyn BehaviorNode>,
) -> SubsumptionNode
pub fn add_layer( self, priority: u8, behavior: Box<dyn BehaviorNode>, ) -> SubsumptionNode
Add a layer with the given priority and behavior.
Layers are automatically sorted by priority (highest first).
Trait Implementations§
Source§impl BehaviorNode for SubsumptionNode
impl BehaviorNode for SubsumptionNode
Source§fn active_capability(&self) -> Option<&str>
fn active_capability(&self) -> Option<&str>
Forwards the winning layer’s capability (the highest-priority layer whose tick()
returned Running/Success this call) - None if every layer failed. Tracked separately
via last_winning_layer since it isn’t otherwise recoverable after tick() returns.
Source§fn tick<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
SubsumptionNode: 'async_trait,
fn tick<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
SubsumptionNode: 'async_trait,
Execute one tick of the behavior. Called repeatedly by the execution engine; should
perform one unit of work, return quickly, and report progress via
NodeStatus.Source§fn children_mut(&mut self) -> Vec<&mut dyn BehaviorNode>
fn children_mut(&mut self) -> Vec<&mut dyn BehaviorNode>
Return mutable references to this node’s child behaviors, in the order
they should receive lifecycle events. Leaf nodes should not override this;
composite nodes override it to expose their children.
Source§fn reset_self(&mut self)
fn reset_self(&mut self)
Reset this node’s own local state, ignoring children. Read more
Source§fn reset<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn reset<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Reset the behavior to its initial state. Read more
Source§impl Debug for SubsumptionNode
impl Debug for SubsumptionNode
Source§impl Default for SubsumptionNode
impl Default for SubsumptionNode
Source§fn default() -> SubsumptionNode
fn default() -> SubsumptionNode
Returns the “default value” for a type. Read more
Auto Trait Implementations§
impl !RefUnwindSafe for SubsumptionNode
impl !UnwindSafe for SubsumptionNode
impl Freeze for SubsumptionNode
impl Send for SubsumptionNode
impl Sync for SubsumptionNode
impl Unpin for SubsumptionNode
impl UnsafeUnpin for SubsumptionNode
Blanket Implementations§
Source§impl<T> BehaviorNodeExt for Twhere
T: BehaviorNode + ?Sized,
impl<T> BehaviorNodeExt for Twhere
T: BehaviorNode + ?Sized,
Source§fn run_until_complete<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
fn run_until_complete<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
Run this behavior until it completes (Success or Failure). Read more
Source§fn run_with_limit<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
max_ticks: usize,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
fn run_with_limit<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
max_ticks: usize,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
Run this behavior with a maximum number of ticks. Read more
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more