ricecoder_refactoring/patterns/
exporter.rs

1//! Pattern export and import functionality
2
3use crate::error::{RefactoringError, Result};
4use super::RefactoringPattern;
5use serde_json;
6use serde_yaml;
7
8/// Exports and imports refactoring patterns
9pub struct PatternExporter;
10
11impl PatternExporter {
12    /// Export a pattern to JSON format
13    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    /// Export a pattern to YAML format
19    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    /// Import a pattern from JSON format
25    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    /// Import a pattern from YAML format
31    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    /// Export multiple patterns to JSON format
37    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    /// Export multiple patterns to YAML format
43    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    /// Import multiple patterns from JSON format
49    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    /// Import multiple patterns from YAML format
55    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}