graphrecords-core 0.5.0

High-performance graph-based data records
Documentation
use crate::{GraphRecord, errors::GraphRecordResult};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use std::ops::{Deref, DerefMut};

pub trait Connector {
    fn initialize(&self, graphrecord: &mut GraphRecord) -> GraphRecordResult<()>;
    fn disconnect(&self, graphrecord: &mut GraphRecord) -> GraphRecordResult<()>;
}

pub trait IngestConnector: Connector {
    type DataSet;

    fn ingest(&self, graphrecord: &mut GraphRecord, data: Self::DataSet) -> GraphRecordResult<()>;
}

pub trait ExportConnector: Connector {
    type DataSet;

    fn export(&self, graphrecord: &GraphRecord) -> GraphRecordResult<Self::DataSet>;
}

impl GraphRecord {
    pub fn with_connector<C: Connector>(
        connector: C,
    ) -> GraphRecordResult<ConnectedGraphRecord<C>> {
        ConnectedGraphRecord::new(connector)
    }

    pub fn from_connector_with_data<D, C: IngestConnector<DataSet = D>>(
        connector: C,
        data: D,
    ) -> GraphRecordResult<ConnectedGraphRecord<C>> {
        ConnectedGraphRecord::from_connector_with_data(connector, data)
    }
}

#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ConnectedGraphRecord<C: Connector> {
    graphrecord: GraphRecord,
    connector: C,
}

impl<C: Connector> Deref for ConnectedGraphRecord<C> {
    type Target = GraphRecord;

    fn deref(&self) -> &Self::Target {
        &self.graphrecord
    }
}

impl<C: Connector> DerefMut for ConnectedGraphRecord<C> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.graphrecord
    }
}

impl<C: Connector> AsRef<GraphRecord> for ConnectedGraphRecord<C> {
    fn as_ref(&self) -> &GraphRecord {
        &self.graphrecord
    }
}

impl<C: Connector> AsMut<GraphRecord> for ConnectedGraphRecord<C> {
    fn as_mut(&mut self) -> &mut GraphRecord {
        &mut self.graphrecord
    }
}

impl<C: Connector> From<ConnectedGraphRecord<C>> for GraphRecord {
    fn from(connected: ConnectedGraphRecord<C>) -> Self {
        connected.graphrecord
    }
}

impl<C: Connector> ConnectedGraphRecord<C> {
    pub fn new(connector: C) -> GraphRecordResult<Self> {
        let mut graphrecord = GraphRecord::new();

        connector.initialize(&mut graphrecord)?;

        Ok(Self {
            graphrecord,
            connector,
        })
    }

    pub fn from_connector_with_data<D>(connector: C, data: D) -> GraphRecordResult<Self>
    where
        C: IngestConnector<DataSet = D>,
    {
        let mut graphrecord = GraphRecord::new();

        connector.initialize(&mut graphrecord)?;

        connector.ingest(&mut graphrecord, data)?;

        Ok(Self {
            graphrecord,
            connector,
        })
    }

    pub fn disconnect(mut self) -> GraphRecordResult<GraphRecord> {
        self.connector.disconnect(&mut self.graphrecord)?;

        Ok(self.graphrecord)
    }
}

impl<C: IngestConnector> ConnectedGraphRecord<C> {
    pub fn ingest(&mut self, data: C::DataSet) -> GraphRecordResult<()> {
        self.connector.ingest(&mut self.graphrecord, data)
    }
}

impl<C: ExportConnector> ConnectedGraphRecord<C> {
    pub fn export(&self) -> GraphRecordResult<C::DataSet> {
        self.connector.export(&self.graphrecord)
    }
}