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    Reordered,
12}
13
14impl std::fmt::Display for ChangeType {
15    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16        match self {
17            ChangeType::Added => write!(f, "added"),
18            ChangeType::Modified => write!(f, "modified"),
19            ChangeType::Deleted => write!(f, "deleted"),
20            ChangeType::Moved => write!(f, "moved"),
21            ChangeType::Renamed => write!(f, "renamed"),
22            ChangeType::Reordered => write!(f, "reordered"),
23        }
24    }
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase")]
29#[non_exhaustive]
30pub struct SemanticChange {
31    pub id: String,
32    pub entity_id: String,
33    pub change_type: ChangeType,
34    pub entity_type: String,
35    pub entity_name: String,
36    #[serde(default)]
37    pub entity_line: usize,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub parent_name: Option<String>,
40    pub file_path: String,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub old_entity_name: Option<String>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub old_file_path: Option<String>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub old_parent_id: Option<String>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub before_content: Option<String>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub after_content: Option<String>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub commit_sha: Option<String>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub author: Option<String>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub timestamp: Option<String>,
57    /// Whether the AST structure changed (true) or only formatting/comments (false).
58    /// None when structural hash is unavailable.
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub structural_change: Option<bool>,
61}