mathypad_core/core/
file_ops.rs1use std::path::Path;
4
5pub trait FileOperations {
7 type Error;
8
9 fn save_content(&self, path: &Path, content: &str) -> Result<(), Self::Error>;
11
12 fn load_content(&self, path: &Path) -> Result<String, Self::Error>;
14}
15
16pub fn serialize_lines(lines: &[String]) -> String {
18 lines.join("\n")
19}
20
21pub 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}