similarity_core/
ast_exchange.rs1use crate::tree::TreeNode;
2use serde::{Deserialize, Serialize};
3use std::rc::Rc;
4
5#[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#[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#[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}