use async_trait::async_trait;
use chrono::{DateTime, Utc};
use thiserror::Error;
use uuid::Uuid;
use crate::model::TemporalEdge;
pub mod duckdb;
#[derive(Debug, Error)]
pub enum Error {
#[error("graph store: {0}")]
Store(String),
#[error("graph store: serde error: {0}")]
Serde(#[from] serde_json::Error),
}
impl From<::duckdb::Error> for Error {
fn from(e: ::duckdb::Error) -> Self {
Error::Store(e.to_string())
}
}
pub type Result<T> = std::result::Result<T, Error>;
#[async_trait]
pub trait GraphStore: Send + Sync {
async fn insert_edge(&self, edge: &TemporalEdge) -> Result<()>;
async fn close_edge(&self, edge_id: Uuid, closed_at: DateTime<Utc>) -> Result<()>;
async fn outgoing_at(&self, node: Uuid, as_of: DateTime<Utc>) -> Result<Vec<TemporalEdge>>;
async fn all_edges(&self) -> Result<Vec<TemporalEdge>>;
}