Skip to main content

sqlite_graphrag/parsers/
mod.rs

1//! Input format parsers (Markdown, YAML, plain text, timestamp).
2
3use chrono::DateTime;
4
5/// Aceita Unix epoch (inteiro >= 0) ou RFC 3339 e retorna Unix epoch.
6pub 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}