mathypad_core/core/
file_ops.rs

1//! File operations abstraction for different platforms
2
3use std::path::Path;
4
5/// Trait for file operations - allows different backends (native fs, web storage, etc.)
6pub trait FileOperations {
7    type Error;
8
9    /// Save content to a file path
10    fn save_content(&self, path: &Path, content: &str) -> Result<(), Self::Error>;
11
12    /// Load content from a file path
13    fn load_content(&self, path: &Path) -> Result<String, Self::Error>;
14}
15
16/// Serialize text lines into a single string for file storage
17pub fn serialize_lines(lines: &[String]) -> String {
18    lines.join("\n")
19}
20
21/// Deserialize file content into individual text lines
22pub fn deserialize_lines(content: &str) -> Vec<String> {
23    if content.is_empty() {
24        vec![String::new()]
25    } else {
26        content.lines().map(|s| s.to_string()).collect()
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn test_serialize_lines() {
36        let lines = vec![
37            "line1".to_string(),
38            "line2".to_string(),
39            "line3".to_string(),
40        ];
41        let content = serialize_lines(&lines);
42        assert_eq!(content, "line1\nline2\nline3");
43    }
44
45    #[test]
46    fn test_serialize_empty_lines() {
47        let lines = Vec::<String>::new();
48        let content = serialize_lines(&lines);
49        assert_eq!(content, "");
50    }
51
52    #[test]
53    fn test_deserialize_lines() {
54        let content = "line1\nline2\nline3";
55        let lines = deserialize_lines(content);
56        assert_eq!(lines, vec!["line1", "line2", "line3"]);
57    }
58
59    #[test]
60    fn test_deserialize_empty_content() {
61        let lines = deserialize_lines("");
62        assert_eq!(lines, vec![""]);
63    }
64
65    #[test]
66    fn test_round_trip() {
67        let original_lines = vec!["5 + 3".to_string(), "line1 * 2".to_string()];
68        let content = serialize_lines(&original_lines);
69        let restored_lines = deserialize_lines(&content);
70        assert_eq!(original_lines, restored_lines);
71    }
72}