| 160 | } |
| 161 | |
| 162 | pub fn cleanup( |
| 163 | &self, |
| 164 | session_id: &str, |
| 165 | revert: &RevertInfo, |
| 166 | manager: &mut SessionManager, |
| 167 | ) -> Result<()> { |
| 168 | let session = match manager.get(session_id) { |
| 169 | Some(s) => s.clone(), |
| 170 | None => return Ok(()), |
| 171 | }; |
| 172 | |
| 173 | let message_id = &revert.message_id; |
| 174 | let messages = &session.messages; |
| 175 | |
| 176 | let mut preserve: Vec<crate::SessionMessage> = Vec::new(); |
| 177 | let mut target_msg: Option<crate::SessionMessage> = None; |
| 178 | |
| 179 | for msg in messages { |
| 180 | if msg.id < *message_id { |
| 181 | preserve.push(msg.clone()); |
| 182 | continue; |
| 183 | } |
| 184 | if msg.id > *message_id { |
| 185 | continue; |
| 186 | } |
| 187 | if revert.part_id.is_some() { |
| 188 | target_msg = Some(msg.clone()); |
| 189 | continue; |
| 190 | } |
| 191 | } |
| 192 | |
| 193 | if let (Some(part_id), Some(mut target)) = (&revert.part_id, target_msg) { |
| 194 | let remove_start = target.parts.iter().position(|p| &p.id == part_id); |
| 195 | |
| 196 | if let Some(start) = remove_start { |
| 197 | let preserve_parts: Vec<crate::MessagePart> = |
| 198 | target.parts.iter().take(start).cloned().collect(); |
| 199 | target.parts = preserve_parts; |
| 200 | preserve.push(target); |
| 201 | } |
| 202 | } |
| 203 | |
| 204 | if let Some(session) = manager.get_mut(session_id) { |
| 205 | session.messages = preserve; |
| 206 | session.clear_revert(); |
| 207 | } |
| 208 | |
| 209 | Ok(()) |
| 210 | } |
| 211 | |
| 212 | /// Compute file diffs from session messages. |
| 213 | /// |