Skip to content

Commit 8e1ddc6

Browse files
committed
imp(types): custom serde implementation
1 parent 45a3e66 commit 8e1ddc6

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

core/src/types.rs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ pub struct FileEntry {
6060
}
6161

6262
/// Cache for storing parsed CODEOWNERS information
63-
#[derive(Debug, Serialize, Deserialize)]
63+
#[derive(Debug)]
6464
pub struct CodeownersCache {
6565
pub entries: Vec<CodeownersEntry>,
6666
pub files: Vec<FileEntry>,
@@ -69,6 +69,65 @@ pub struct CodeownersCache {
6969
pub tags_map: std::collections::HashMap<Tag, Vec<PathBuf>>,
7070
}
7171

72+
impl Serialize for CodeownersCache {
73+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
74+
where
75+
S: serde::Serializer,
76+
{
77+
use serde::ser::SerializeStruct;
78+
79+
let mut state = serializer.serialize_struct("CodeownersCache", 4)?;
80+
state.serialize_field("entries", &self.entries)?;
81+
state.serialize_field("files", &self.files)?;
82+
83+
// Convert owners_map to a serializable format
84+
let owners_map_serializable: Vec<(&Owner, &Vec<PathBuf>)> =
85+
self.owners_map.iter().collect();
86+
state.serialize_field("owners_map", &owners_map_serializable)?;
87+
88+
// Convert tags_map to a serializable format
89+
let tags_map_serializable: Vec<(&Tag, &Vec<PathBuf>)> = self.tags_map.iter().collect();
90+
state.serialize_field("tags_map", &tags_map_serializable)?;
91+
92+
state.end()
93+
}
94+
}
95+
96+
impl<'de> Deserialize<'de> for CodeownersCache {
97+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
98+
where
99+
D: serde::Deserializer<'de>,
100+
{
101+
#[derive(Deserialize)]
102+
struct CodeownersCacheHelper {
103+
entries: Vec<CodeownersEntry>,
104+
files: Vec<FileEntry>,
105+
owners_map: Vec<(Owner, Vec<PathBuf>)>,
106+
tags_map: Vec<(Tag, Vec<PathBuf>)>,
107+
}
108+
109+
let helper = CodeownersCacheHelper::deserialize(deserializer)?;
110+
111+
// Convert back to HashMap
112+
let mut owners_map = std::collections::HashMap::new();
113+
for (owner, paths) in helper.owners_map {
114+
owners_map.insert(owner, paths);
115+
}
116+
117+
let mut tags_map = std::collections::HashMap::new();
118+
for (tag, paths) in helper.tags_map {
119+
tags_map.insert(tag, paths);
120+
}
121+
122+
Ok(CodeownersCache {
123+
entries: helper.entries,
124+
files: helper.files,
125+
owners_map,
126+
tags_map,
127+
})
128+
}
129+
}
130+
72131
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
73132
pub enum CacheEncoding {
74133
Bincode,

0 commit comments

Comments
 (0)