use std::collections::HashMap;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use super::cache::CacheConfig;
use crate::core::configs::op_config::{OpBound, OpType};
use crate::core::exceptions::OperonError;
use crate::core::states::cell::ContextId;
use crate::core::states::state::MemoryState;
use crate::core::utils::common::Param;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpMeta {
pub name: String,
pub full_name: String,
#[serde(rename = "type")]
pub kind: OpType,
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default)]
pub verbose: bool,
#[serde(default)]
pub stream: bool,
#[serde(default)]
pub bound: OpBound,
#[serde(default)]
pub inputs: HashMap<String, Param>,
#[serde(default)]
pub outputs: HashMap<String, Param>,
#[serde(default)]
pub cache: Option<CacheConfig>,
#[serde(default)]
pub delay: f64,
}
fn default_true() -> bool {
true
}
pub struct OpContext<'a> {
pub state: &'a MemoryState,
pub context: &'a ContextId,
}
#[derive(Debug, Clone)]
pub enum OpResult {
Done(Value),
Pending,
}
#[async_trait]
pub trait BaseOp: Send + Sync {
fn meta(&self) -> &OpMeta;
async fn exec_core(
&self,
inputs: Map<String, Value>,
ctx: &OpContext<'_>,
) -> Result<Option<Value>, OperonError>;
}