1use async_trait::async_trait;
2use chrono::{DateTime, Utc};
3use thiserror::Error;
4use uuid::Uuid;
5
6use crate::model::TemporalEdge;
7
8pub mod duckdb;
9
10#[derive(Debug, Error)]
11pub enum Error {
12 #[error("graph store: {0}")]
13 Store(String),
14 #[error("graph store: serde error: {0}")]
15 Serde(#[from] serde_json::Error),
16}
17
18impl From<::duckdb::Error> for Error {
19 fn from(e: ::duckdb::Error) -> Self {
20 Error::Store(e.to_string())
21 }
22}
23
24pub type Result<T> = std::result::Result<T, Error>;
25
26#[async_trait]
32pub trait GraphStore: Send + Sync {
33 async fn insert_edge(&self, edge: &TemporalEdge) -> Result<()>;
35
36 async fn close_edge(&self, edge_id: Uuid, closed_at: DateTime<Utc>) -> Result<()>;
40
41 async fn outgoing_at(&self, node: Uuid, as_of: DateTime<Utc>) -> Result<Vec<TemporalEdge>>;
44
45 async fn all_edges(&self) -> Result<Vec<TemporalEdge>>;
49}