sqlite_graphrag/parsers/
mod.rs1use chrono::DateTime;
2
3pub fn parse_expected_updated_at(s: &str) -> Result<i64, String> {
5 if let Ok(secs) = s.parse::<i64>() {
6 if secs >= 0 {
7 return Ok(secs);
8 }
9 }
10 DateTime::parse_from_rfc3339(s)
11 .map(|dt| dt.timestamp())
12 .map_err(|e| {
13 format!(
14 "valor deve ser Unix epoch (inteiro >= 0) ou RFC 3339 (ex: 2026-04-19T12:00:00Z): {e}"
15 )
16 })
17}
18
19#[cfg(test)]
20mod testes {
21 use super::*;
22
23 #[test]
24 fn aceita_unix_epoch() {
25 assert_eq!(parse_expected_updated_at("1700000000").unwrap(), 1700000000);
26 }
27
28 #[test]
29 fn aceita_zero() {
30 assert_eq!(parse_expected_updated_at("0").unwrap(), 0);
31 }
32
33 #[test]
34 fn aceita_rfc_3339_utc() {
35 let resultado = parse_expected_updated_at("2020-01-01T00:00:00Z");
36 assert!(resultado.is_ok());
37 assert_eq!(resultado.unwrap(), 1577836800);
38 }
39
40 #[test]
41 fn aceita_rfc_3339_com_offset() {
42 let resultado = parse_expected_updated_at("2026-04-19T12:00:00+00:00");
43 assert!(resultado.is_ok());
44 }
45
46 #[test]
47 fn rejeita_string_invalida() {
48 assert!(parse_expected_updated_at("bananas").is_err());
49 }
50
51 #[test]
52 fn rejeita_negativo() {
53 let erro = parse_expected_updated_at("-1");
54 assert!(erro.is_err());
55 }
56
57 #[test]
58 fn mensagem_de_erro_menciona_formato() {
59 let msg = parse_expected_updated_at("invalido").unwrap_err();
60 assert!(msg.contains("RFC 3339") || msg.contains("Unix epoch"));
61 }
62}