use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::execution::{ExternalError, InvocationContext};
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq, Serialize, Deserialize)]
pub struct ContextGeneration {
pub user_scope: String,
pub identity: String,
pub memory: String,
pub integration_guide: String,
pub installed_integrations: String,
pub scope_integrations: String,
}
impl ContextGeneration {
#[must_use]
pub fn new(value: impl Into<String>) -> Self {
let value = value.into();
Self {
user_scope: value.clone(),
identity: value.clone(),
memory: value.clone(),
integration_guide: value.clone(),
installed_integrations: value.clone(),
scope_integrations: value,
}
}
#[must_use]
pub fn is_complete(&self) -> bool {
[
&self.user_scope,
&self.identity,
&self.memory,
&self.integration_guide,
&self.installed_integrations,
&self.scope_integrations,
]
.into_iter()
.all(|value| !value.trim().is_empty())
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ContextInvalidation {
pub generation: ContextGeneration,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
pub struct OperationalContext {
pub user_scope: String,
pub identity: String,
pub memory: String,
pub integration_guide: String,
pub installed_integrations: String,
pub scope_integrations: String,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
pub struct OperationalContextDelta {
pub generation: ContextGeneration,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user_scope: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub identity: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub memory: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub integration_guide: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub installed_integrations: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scope_integrations: Option<String>,
}
#[async_trait]
pub trait ContextSource: Send + Sync {
async fn load(&self, context: &InvocationContext) -> Result<OperationalContext, ExternalError>;
}