similarity_core/
ast_exchange.rs

1use crate::tree::TreeNode;
2use serde::{Deserialize, Serialize};
3use std::rc::Rc;
4
5/// Serializable version of TreeNode for external exchange
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct SerializableTreeNode {
8    pub label: String,
9    pub value: String,
10    pub children: Vec<SerializableTreeNode>,
11    pub id: usize,
12}
13
14impl From<&TreeNode> for SerializableTreeNode {
15    fn from(node: &TreeNode) -> Self {
16        SerializableTreeNode {
17            label: node.label.clone(),
18            value: node.value.clone(),
19            children: node.children.iter().map(|child| child.as_ref().into()).collect(),
20            id: node.id,
21        }
22    }
23}
24
25impl From<SerializableTreeNode> for TreeNode {
26    fn from(node: SerializableTreeNode) -> Self {
27        let mut tree_node = TreeNode::new(node.label, node.value, node.id);
28        for child in node.children {
29            tree_node.add_child(Rc::new(child.into()));
30        }
31        tree_node
32    }
33}
34
35/// Function definition for external exchange
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct ExchangeFunctionDef {
38    pub name: String,
39    pub start_line: u32,
40    pub end_line: u32,
41    pub body_start_line: u32,
42    pub body_end_line: u32,
43    pub ast: SerializableTreeNode,
44}
45
46/// Complete AST exchange format
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct ASTExchange {
49    pub language: String,
50    pub filename: String,
51    pub functions: Vec<ExchangeFunctionDef>,
52    pub full_ast: Option<SerializableTreeNode>,
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn test_tree_node_serialization() {
61        let mut root = TreeNode::new("function".to_string(), "foo".to_string(), 0);
62        root.add_child(Rc::new(TreeNode::new("params".to_string(), "".to_string(), 1)));
63        root.add_child(Rc::new(TreeNode::new("body".to_string(), "".to_string(), 2)));
64
65        let serializable: SerializableTreeNode = (&root).into();
66        let json = serde_json::to_string(&serializable).unwrap();
67        let deserialized: SerializableTreeNode = serde_json::from_str(&json).unwrap();
68        let restored: TreeNode = deserialized.into();
69
70        assert_eq!(root.label, restored.label);
71        assert_eq!(root.children.len(), restored.children.len());
72    }
73}