use std::fmt;
use sophia_api::dataset::Dataset;
use sophia_api::parser::QuadParser;
use sophia_api::serializer::{QuadSerializer, Stringifier};
use sophia_api::source::QuadSource;
use sophia_inmem::dataset::LightDataset;
use sophia_turtle::parser::nq::NQuadsParser;
use sophia_turtle::serializer::nq::NQuadsSerializer;
use crate::from_nquads::{from_nquads, NQuadsParseError};
use crate::model::Graph;
use crate::nquads::to_nquads;
pub type SophiaDataset = LightDataset;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SophiaAdapterError {
detail: String,
}
impl SophiaAdapterError {
fn new(detail: impl Into<String>) -> Self {
Self {
detail: detail.into(),
}
}
fn wrap(context: &str, err: impl fmt::Display) -> Self {
Self::new(format!("{context}: {err}"))
}
pub fn detail(&self) -> &str {
&self.detail
}
}
impl fmt::Display for SophiaAdapterError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.detail)
}
}
impl std::error::Error for SophiaAdapterError {}
impl From<NQuadsParseError> for SophiaAdapterError {
fn from(value: NQuadsParseError) -> Self {
Self::wrap("GTS N-Quads import failed", value)
}
}
pub fn to_sophia_dataset(graph: &Graph) -> Result<SophiaDataset, SophiaAdapterError> {
let nquads = to_nquads(graph);
NQuadsParser::new()
.with_preserve_bn_labels(true)
.parse_str(&nquads)
.collect_quads::<SophiaDataset>()
.map_err(|err| SophiaAdapterError::wrap("Sophia N-Quads parse failed", err))
}
pub fn from_sophia_dataset<D>(dataset: &D) -> Result<Vec<u8>, SophiaAdapterError>
where
D: Dataset,
{
let mut serializer = NQuadsSerializer::new_stringifier();
serializer
.serialize_dataset(dataset)
.map_err(|err| SophiaAdapterError::wrap("Sophia N-Quads serialization failed", err))?;
Ok(from_nquads(serializer.as_str())?)
}