新增: 初始化 DevFlow 项目仓库
Tauri 2 + Vue 3 + Vite 6 桌面应用,Rust workspace 含 13 个 crate (df-ai / df-storage / df-workflow / df-core / df-execute 等)。 核心能力:AI 聊天 agentic 循环(工具调用+人工审批)、工作流引擎、 任务/想法/项目/阶段管理、可追溯性,及配套前端组件。
This commit is contained in:
87
crates/df-workflow/src/registry.rs
Normal file
87
crates/df-workflow/src/registry.rs
Normal file
@@ -0,0 +1,87 @@
|
||||
//! 节点注册表 — 根据 node_type 字符串创建节点实例
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
use crate::dag::Dag;
|
||||
use crate::dag_def::DagDef;
|
||||
use crate::node::Node;
|
||||
|
||||
/// 节点工厂函数类型
|
||||
type NodeFactory = Box<dyn Fn(&serde_json::Value) -> Box<dyn Node> + Send + Sync>;
|
||||
|
||||
/// 节点注册表 — 根据 node_type 字符串创建节点实例
|
||||
pub struct NodeRegistry {
|
||||
factories: HashMap<String, NodeFactory>,
|
||||
}
|
||||
|
||||
impl NodeRegistry {
|
||||
/// 创建空的注册表
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
factories: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// 注册一个节点工厂
|
||||
pub fn register<F>(&mut self, type_name: &str, factory: F)
|
||||
where
|
||||
F: Fn(&serde_json::Value) -> Box<dyn Node> + Send + Sync + 'static,
|
||||
{
|
||||
self.factories.insert(type_name.to_string(), Box::new(factory));
|
||||
}
|
||||
|
||||
/// 根据 node_type 创建节点实例
|
||||
pub fn create(&self, type_name: &str, config: &serde_json::Value) -> anyhow::Result<Box<dyn Node>> {
|
||||
self.factories
|
||||
.get(type_name)
|
||||
.ok_or_else(|| anyhow::anyhow!("未注册的节点类型: {}", type_name))
|
||||
.map(|factory| factory(config))
|
||||
}
|
||||
|
||||
/// 从 DagDef 构建完整的运行时 Dag
|
||||
pub fn build_dag(&self, def: &DagDef) -> anyhow::Result<Dag> {
|
||||
let mut dag = Dag::new();
|
||||
|
||||
// 创建所有节点实例
|
||||
for (id, node_def) in &def.nodes {
|
||||
let node = self.create(&node_def.node_type, &node_def.config)?;
|
||||
dag.add_node(id.clone(), node);
|
||||
}
|
||||
|
||||
// 添加所有边
|
||||
for edge_def in &def.edges {
|
||||
match &edge_def.condition {
|
||||
Some(cond) => dag.add_edge_with_condition(
|
||||
edge_def.source.clone(),
|
||||
edge_def.target.clone(),
|
||||
cond.clone(),
|
||||
),
|
||||
None => dag.add_edge(edge_def.source.clone(), edge_def.target.clone()),
|
||||
}
|
||||
}
|
||||
|
||||
Ok(dag)
|
||||
}
|
||||
|
||||
/// 检查是否已注册指定类型
|
||||
pub fn is_registered(&self, type_name: &str) -> bool {
|
||||
self.factories.contains_key(type_name)
|
||||
}
|
||||
|
||||
/// 列出所有已注册的节点类型
|
||||
pub fn registered_types(&self) -> Vec<&str> {
|
||||
self.factories.keys().map(|s| s.as_str()).collect()
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for NodeRegistry {
|
||||
fn default() -> Self {
|
||||
let mut registry = Self::new();
|
||||
registry.register("script", |_config| {
|
||||
// ScriptNode 的工厂 — 需要 df-nodes 依赖后才可用
|
||||
// 这里返回一个占位实现,实际项目中由 df-nodes crate 注册
|
||||
unimplemented!("ScriptNode 需要通过 df-nodes 注册")
|
||||
});
|
||||
registry
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user