Skip to main content

sqlite_graphrag/parsers/
mod.rs

1use chrono::DateTime;
2
3/// Aceita Unix epoch (inteiro >= 0) ou RFC 3339 e retorna Unix epoch.
4pub 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}