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