use async_trait::async_trait; use crate::context::Context; use crate::error::Result; use crate::graph::Graph; use crate::outcome::Outcome; use crate::retry::RetryPolicy; #[async_trait] pub trait NodeHandler: Send + Sync { async fn execute( &self, node: &G::Node, context: &Context, graph: &G, ) -> Result>; async fn context_for_edge_selection(&self, context: &Context, _graph: &G) -> Result { Ok(context.clone()) } fn retry_policy(&self, _node: &G::Node, _graph: &G) -> RetryPolicy { RetryPolicy::none() } fn on_retries_exhausted( &self, _node: &G::Node, _last_outcome: Outcome, ) -> Outcome { Outcome::fail("max retries exceeded") } }