use std::collections::HashMap;
use crate::error::BoltError;
use crate::types::{BoltDict, BoltValue};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct SessionHandle(pub String);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TransactionHandle(pub String);
pub struct SessionConfig {
pub user_agent: String,
pub database: Option<String>,
}
pub enum SessionProperty {
Database(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AccessMode {
Read,
Write,
}
#[derive(Debug, Clone)]
pub struct AuthCredentials {
pub scheme: String,
pub principal: Option<String>,
pub credentials: Option<String>,
}
#[derive(Debug, Clone)]
pub struct BoltRecord {
pub values: Vec<BoltValue>,
}
#[derive(Debug, Clone)]
pub struct ResultMetadata {
pub columns: Vec<String>,
pub extra: BoltDict,
}
#[derive(Debug, Clone)]
pub struct ResultStream {
pub metadata: ResultMetadata,
pub records: Vec<BoltRecord>,
pub summary: BoltDict,
}
#[derive(Debug, Clone)]
pub struct RoutingServer {
pub addresses: Vec<String>,
pub role: String,
}
#[derive(Debug, Clone)]
pub struct RoutingTable {
pub ttl: i64,
pub db: String,
pub servers: Vec<RoutingServer>,
}
pub fn extract_bookmarks(extra: &BoltDict) -> Vec<String> {
match extra.get("bookmarks") {
Some(BoltValue::List(list)) => list
.iter()
.filter_map(|v| match v {
BoltValue::String(s) => Some(s.clone()),
_ => None,
})
.collect(),
_ => Vec::new(),
}
}
#[async_trait::async_trait]
pub trait BoltBackend: Send + Sync + 'static {
async fn create_session(&self, config: &SessionConfig) -> Result<SessionHandle, BoltError>;
async fn close_session(&self, session: &SessionHandle) -> Result<(), BoltError>;
async fn configure_session(
&self,
session: &SessionHandle,
property: SessionProperty,
) -> Result<(), BoltError>;
async fn reset_session(&self, session: &SessionHandle) -> Result<(), BoltError>;
async fn execute(
&self,
session: &SessionHandle,
query: &str,
parameters: &HashMap<String, BoltValue>,
extra: &BoltDict,
transaction: Option<&TransactionHandle>,
) -> Result<ResultStream, BoltError>;
async fn begin_transaction(
&self,
session: &SessionHandle,
extra: &BoltDict,
) -> Result<TransactionHandle, BoltError>;
async fn commit(
&self,
session: &SessionHandle,
transaction: &TransactionHandle,
) -> Result<BoltDict, BoltError>;
async fn rollback(
&self,
session: &SessionHandle,
transaction: &TransactionHandle,
) -> Result<(), BoltError>;
async fn get_server_info(&self) -> Result<BoltDict, BoltError>;
async fn route(
&self,
_routing_context: &BoltDict,
_bookmarks: &[String],
_db: Option<&str>,
) -> Result<RoutingTable, BoltError> {
Err(BoltError::Protocol("routing not supported".into()))
}
}