use std::{collections::HashMap, future::Future, pin::Pin, sync::Arc};
use crate::Result;
pub type BoxNodeFuture<State> = Pin<Box<dyn Future<Output = Result<NodeOutput<State>>> + Send>>;
pub type NodeFn<State> = dyn Fn(State) -> BoxNodeFuture<State> + Send + Sync;
#[derive(Clone)]
pub struct Node<State> {
pub(crate) name: String,
pub(crate) handler: Arc<NodeFn<State>>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum NodeOutput<State> {
Continue(State),
Route {
state: State,
route: String,
},
End(State),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Edge {
Direct(String),
Conditional(HashMap<String, String>),
End,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct GraphRun<State> {
pub state: State,
pub visited: Vec<String>,
}
pub struct StateGraph<State> {
pub(crate) nodes: HashMap<String, Node<State>>,
pub(crate) edges: HashMap<String, Edge>,
pub(crate) start: Option<String>,
pub(crate) recursion_limit: usize,
}