viceroy/src/manifest/skill/skill_structure_tree.rs

47 lines
1.3 KiB
Rust

use std::collections::HashMap;
use serde::Serialize;
#[derive(Serialize)]
pub struct PythonFuncNode{
pub func_sign: String,
pub func_args: HashMap<String, String>,
pub func_return_type: String,
pub func_docs: String,
}
#[derive(Serialize)]
pub struct PythonFileNode{
pub file_name: String,
pub func_dict: HashMap<String, PythonFuncNode>,
}
#[derive(Serialize)]
#[serde(tag = "type", content = "data")]
pub enum SkillNode {
Folder(String, HashMap<String, SkillNode>),
Python(PythonFileNode),
File(String),
}
impl SkillNode {
pub fn new_folder(name: &str) -> Self {
SkillNode::Folder(name.to_string(), HashMap::new())
}
pub fn insert_recursive(&mut self, segments: &[&str], data: SkillNode) {
if let SkillNode::Folder(_name, children) = self {
let current_seg = segments[0];
if segments.len() == 1 {
children.insert(current_seg.to_string(), data);
} else {
let next_node = children
.entry(current_seg.to_string())
.or_insert_with(|| SkillNode::new_folder(current_seg));
next_node.insert_recursive(&segments[1..], data);
}
} else {
panic!("试图在已存在文件{}内保存文件", segments[0]);
}
}
}