use crate::plexus::streaming::PlexusStream;
use crate::plexus::PlexusError;
use crate::types::Handle;
use async_trait::async_trait;
#[async_trait]
pub trait HubContext: Clone + Send + Sync + 'static {
async fn resolve_handle(&self, handle: &Handle) -> Result<PlexusStream, PlexusError>;
async fn call(&self, method: &str, params: serde_json::Value) -> Result<PlexusStream, PlexusError>;
fn is_valid(&self) -> bool {
true
}
}
pub trait ParentAware {
type Parent: HubContext;
fn inject_parent(&self, parent: Self::Parent);
fn has_parent(&self) -> bool;
}
#[derive(Clone, Debug, Default)]
pub struct NoParent;
#[async_trait]
impl HubContext for NoParent {
async fn resolve_handle(&self, _handle: &Handle) -> Result<PlexusStream, PlexusError> {
Err(PlexusError::ExecutionError(
"No parent context available for handle resolution".to_string(),
))
}
async fn call(&self, method: &str, _params: serde_json::Value) -> Result<PlexusStream, PlexusError> {
Err(PlexusError::ExecutionError(format!(
"No parent context available to route call: {}",
method
)))
}
fn is_valid(&self) -> bool {
false
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn no_parent_is_invalid() {
let ctx = NoParent;
assert!(!ctx.is_valid());
}
#[tokio::test]
async fn no_parent_resolve_fails() {
let ctx = NoParent;
let handle = Handle::new(uuid::Uuid::new_v4(), "1.0.0", "test");
let result = ctx.resolve_handle(&handle).await;
assert!(result.is_err());
}
}