Skip to main content

sem_core/model/
change.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
4#[serde(rename_all = "lowercase")]
5pub enum ChangeType {
6    Added,
7    Modified,
8    Deleted,
9    Moved,
10    Renamed,
11}
12
13impl std::fmt::Display for ChangeType {
14    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15        match self {
16            ChangeType::Added => write!(f, "added"),
17            ChangeType::Modified => write!(f, "modified"),
18            ChangeType::Deleted => write!(f, "deleted"),
19            ChangeType::Moved => write!(f, "moved"),
20            ChangeType::Renamed => write!(f, "renamed"),
21        }
22    }
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct SemanticChange {
28    pub id: String,
29    pub entity_id: String,
30    pub change_type: ChangeType,
31    pub entity_type: String,
32    pub entity_name: String,
33    pub file_path: String,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub old_entity_name: Option<String>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub old_file_path: Option<String>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub before_content: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub after_content: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub commit_sha: Option<String>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub author: Option<String>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub timestamp: Option<String>,
48    /// Whether the AST structure changed (true) or only formatting/comments (false).
49    /// None when structural hash is unavailable.
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub structural_change: Option<bool>,
52}