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")]
29pub struct SemanticChange {
30 pub id: String,
31 pub entity_id: String,
32 pub change_type: ChangeType,
33 pub entity_type: String,
34 pub entity_name: String,
35 #[serde(default)]
36 pub entity_line: usize,
37 pub file_path: String,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub old_entity_name: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub old_file_path: Option<String>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub before_content: Option<String>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub after_content: Option<String>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub commit_sha: Option<String>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub author: Option<String>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub timestamp: Option<String>,
52 #[serde(skip_serializing_if = "Option::is_none")]
55 pub structural_change: Option<bool>,
56}