(
&mut self,
uid: u64,
)
| 391 | } |
| 392 | |
| 393 | fn fetch_message_metadata( |
| 394 | &mut self, |
| 395 | uid: u64, |
| 396 | ) -> Result<Option<EmailMessageMetadata>, EmailServiceError> { |
| 397 | let command = if self.gmail_thread_id_capable { |
| 398 | format!( |
| 399 | "UID FETCH {uid} (UID FLAGS INTERNALDATE X-GM-THRID BODY.PEEK[HEADER.FIELDS (FROM SUBJECT DATE)])" |
| 400 | ) |
| 401 | } else { |
| 402 | format!( |
| 403 | "UID FETCH {uid} (UID FLAGS INTERNALDATE BODY.PEEK[HEADER.FIELDS (FROM SUBJECT DATE)])" |
| 404 | ) |
| 405 | }; |
| 406 | let output = self.run_command(&command)?; |
| 407 | |
| 408 | let Some(fetch_line) = output |
| 409 | .lines |
| 410 | .iter() |
| 411 | .find(|line| line.starts_with("* ") && line.contains(" FETCH (")) |
| 412 | else { |
| 413 | return Ok(None); |
| 414 | }; |
| 415 | |
| 416 | let parsed_uid = capture_numeric_token(fetch_line, "UID") |
| 417 | .and_then(|value| value.parse::<u64>().ok()) |
| 418 | .unwrap_or(uid); |
| 419 | let thread_id = capture_numeric_token(fetch_line, "X-GM-THRID"); |
| 420 | let flags = capture_parenthesized_token(fetch_line, "FLAGS") |
| 421 | .map(|value| parse_flags(&value)) |
| 422 | .unwrap_or_default(); |
| 423 | let internal_date = capture_quoted_token(fetch_line, "INTERNALDATE"); |
| 424 | |
| 425 | let headers = output |
| 426 | .literals |
| 427 | .first() |
| 428 | .map(|literal| parse_headers(literal)) |
| 429 | .unwrap_or_default(); |
| 430 | |
| 431 | let from = headers.get("from").cloned(); |
| 432 | let subject = headers.get("subject").cloned(); |
| 433 | let date = headers.get("date").cloned().or(internal_date); |
| 434 | |
| 435 | Ok(Some(EmailMessageMetadata { |
| 436 | id: parsed_uid.to_string(), |
| 437 | thread_id, |
| 438 | from, |
| 439 | subject, |
| 440 | date, |
| 441 | snippet: None, |
| 442 | internal_date_ms: None, |
| 443 | label_ids: flags, |
| 444 | })) |
| 445 | } |
| 446 | |
| 447 | fn fetch_message_content( |
| 448 | &mut self, |
no test coverage detected