ricecoder_refactoring/patterns/
exporter.rs1use crate::error::{RefactoringError, Result};
4use super::RefactoringPattern;
5use serde_json;
6use serde_yaml;
7
8pub struct PatternExporter;
10
11impl PatternExporter {
12 pub fn export_json(pattern: &RefactoringPattern) -> Result<String> {
14 serde_json::to_string_pretty(pattern)
15 .map_err(|e| RefactoringError::Other(format!("Failed to export pattern to JSON: {}", e)))
16 }
17
18 pub fn export_yaml(pattern: &RefactoringPattern) -> Result<String> {
20 serde_yaml::to_string(pattern)
21 .map_err(|e| RefactoringError::Other(format!("Failed to export pattern to YAML: {}", e)))
22 }
23
24 pub fn import_json(data: &str) -> Result<RefactoringPattern> {
26 serde_json::from_str(data)
27 .map_err(|e| RefactoringError::Other(format!("Failed to import pattern from JSON: {}", e)))
28 }
29
30 pub fn import_yaml(data: &str) -> Result<RefactoringPattern> {
32 serde_yaml::from_str(data)
33 .map_err(|e| RefactoringError::Other(format!("Failed to import pattern from YAML: {}", e)))
34 }
35
36 pub fn export_patterns_json(patterns: &[RefactoringPattern]) -> Result<String> {
38 serde_json::to_string_pretty(patterns)
39 .map_err(|e| RefactoringError::Other(format!("Failed to export patterns to JSON: {}", e)))
40 }
41
42 pub fn export_patterns_yaml(patterns: &[RefactoringPattern]) -> Result<String> {
44 serde_yaml::to_string(patterns)
45 .map_err(|e| RefactoringError::Other(format!("Failed to export patterns to YAML: {}", e)))
46 }
47
48 pub fn import_patterns_json(data: &str) -> Result<Vec<RefactoringPattern>> {
50 serde_json::from_str(data)
51 .map_err(|e| RefactoringError::Other(format!("Failed to import patterns from JSON: {}", e)))
52 }
53
54 pub fn import_patterns_yaml(data: &str) -> Result<Vec<RefactoringPattern>> {
56 serde_yaml::from_str(data)
57 .map_err(|e| RefactoringError::Other(format!("Failed to import patterns from YAML: {}", e)))
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64 use crate::patterns::{PatternParameter, PatternScope};
65
66 fn create_test_pattern() -> RefactoringPattern {
67 RefactoringPattern {
68 name: "test_pattern".to_string(),
69 description: "A test pattern".to_string(),
70 template: "fn {{old_name}}() -> fn {{new_name}}()".to_string(),
71 parameters: vec![
72 PatternParameter {
73 name: "old_name".to_string(),
74 placeholder: "{{old_name}}".to_string(),
75 description: "Old function name".to_string(),
76 },
77 PatternParameter {
78 name: "new_name".to_string(),
79 placeholder: "{{new_name}}".to_string(),
80 description: "New function name".to_string(),
81 },
82 ],
83 scope: PatternScope::Global,
84 }
85 }
86
87 #[test]
88 fn test_export_import_json() -> Result<()> {
89 let pattern = create_test_pattern();
90 let exported = PatternExporter::export_json(&pattern)?;
91 let imported = PatternExporter::import_json(&exported)?;
92
93 assert_eq!(imported.name, pattern.name);
94 assert_eq!(imported.description, pattern.description);
95 assert_eq!(imported.template, pattern.template);
96 assert_eq!(imported.parameters.len(), pattern.parameters.len());
97
98 Ok(())
99 }
100
101 #[test]
102 fn test_export_import_yaml() -> Result<()> {
103 let pattern = create_test_pattern();
104 let exported = PatternExporter::export_yaml(&pattern)?;
105 let imported = PatternExporter::import_yaml(&exported)?;
106
107 assert_eq!(imported.name, pattern.name);
108 assert_eq!(imported.description, pattern.description);
109 assert_eq!(imported.template, pattern.template);
110 assert_eq!(imported.parameters.len(), pattern.parameters.len());
111
112 Ok(())
113 }
114
115 #[test]
116 fn test_export_import_multiple_json() -> Result<()> {
117 let patterns = vec![create_test_pattern(), create_test_pattern()];
118 let exported = PatternExporter::export_patterns_json(&patterns)?;
119 let imported = PatternExporter::import_patterns_json(&exported)?;
120
121 assert_eq!(imported.len(), patterns.len());
122 assert_eq!(imported[0].name, patterns[0].name);
123
124 Ok(())
125 }
126
127 #[test]
128 fn test_export_import_multiple_yaml() -> Result<()> {
129 let patterns = vec![create_test_pattern(), create_test_pattern()];
130 let exported = PatternExporter::export_patterns_yaml(&patterns)?;
131 let imported = PatternExporter::import_patterns_yaml(&exported)?;
132
133 assert_eq!(imported.len(), patterns.len());
134 assert_eq!(imported[0].name, patterns[0].name);
135
136 Ok(())
137 }
138
139 #[test]
140 fn test_import_invalid_json() {
141 let result = PatternExporter::import_json("invalid json");
142 assert!(result.is_err());
143 }
144
145 #[test]
146 fn test_import_invalid_yaml() {
147 let result = PatternExporter::import_yaml("invalid: [yaml");
148 assert!(result.is_err());
149 }
150}