ricecoder_undo_redo/
models.rs

1//! Data models and validators
2
3use crate::change::Change;
4use crate::error::UndoRedoError;
5
6/// Validates changes for consistency and correctness
7pub struct ChangeValidator;
8
9impl ChangeValidator {
10    /// Validate a change for consistency
11    pub fn validate_change(change: &Change) -> Result<(), UndoRedoError> {
12        // Delegate to the Change's own validation method
13        change.validate()
14    }
15
16    /// Validate a change and handle file-related errors gracefully
17    pub fn validate_change_graceful(change: &Change) -> Result<(), UndoRedoError> {
18        // Perform basic validation
19        change.validate()?;
20
21        // Additional graceful error handling for file operations
22        // File not found errors are logged but don't fail validation
23        if change.file_path.is_empty() {
24            return Err(UndoRedoError::validation_error("file_path cannot be empty"));
25        }
26
27        Ok(())
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use crate::change::ChangeType;
35
36    #[test]
37    fn test_change_validator_valid_modify() {
38        let change = Change::new(
39            "test.txt",
40            "before",
41            "after",
42            "Modify",
43            ChangeType::Modify,
44        )
45        .unwrap();
46        let result = ChangeValidator::validate_change(&change);
47        assert!(result.is_ok());
48    }
49
50    #[test]
51    fn test_change_validator_valid_create() {
52        let change = Change::new(
53            "test.txt",
54            "",
55            "content",
56            "Create",
57            ChangeType::Create,
58        )
59        .unwrap();
60        let result = ChangeValidator::validate_change(&change);
61        assert!(result.is_ok());
62    }
63
64    #[test]
65    fn test_change_validator_valid_delete() {
66        let change = Change::new(
67            "test.txt",
68            "content",
69            "",
70            "Delete",
71            ChangeType::Delete,
72        )
73        .unwrap();
74        let result = ChangeValidator::validate_change(&change);
75        assert!(result.is_ok());
76    }
77
78    #[test]
79    fn test_change_validator_graceful() {
80        let change = Change::new(
81            "test.txt",
82            "before",
83            "after",
84            "Modify",
85            ChangeType::Modify,
86        )
87        .unwrap();
88        let result = ChangeValidator::validate_change_graceful(&change);
89        assert!(result.is_ok());
90    }
91}