use linked_data::{LinkedDataSerializer, SerializeLinkedData, ser::SerializeLinkedDataWith};
use rdf_syntax::{Id, Term};
use crate::{JsonLdExpandedDocument, JsonLdLenient, JsonLdValidate};
mod object;
#[derive(Clone, Default)]
pub struct RdfSerializationOptions {
pub produce_generalized_rdf: bool,
}
impl SerializeLinkedDataWith<RdfSerializationOptions> for JsonLdExpandedDocument {
fn serialize_rdf_with<S>(
&self,
opts: RdfSerializationOptions,
mut serializer: S,
graph: Option<&Term>,
) -> Result<S::Ok, S::Error>
where
S: LinkedDataSerializer<Term>,
{
for object in self {
object.serialize_rdf_with(opts.clone(), serializer.as_dyn_mut(), graph)?;
}
serializer.end()
}
}
impl SerializeLinkedData for JsonLdExpandedDocument {
fn serialize_rdf<S>(&self, serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
where
S: LinkedDataSerializer<Term>,
{
self.serialize_rdf_with(RdfSerializationOptions::default(), serializer, graph)
}
}
impl JsonLdLenient<Id> {
pub fn serialize_rdf_term<S>(&self, serializer: &mut S) -> Result<Term, S::Error>
where
S: LinkedDataSerializer,
{
match self {
Self::Valid(id) => Ok(id.clone().into()),
Self::Invalid(_) => serializer.interpret(None),
}
}
}
impl<T, Q> SerializeLinkedDataWith<Q> for JsonLdLenient<T>
where
T: JsonLdValidate + SerializeLinkedDataWith<Q>,
{
fn serialize_rdf_with<S>(
&self,
state: Q,
serializer: S,
graph: Option<&Term>,
) -> Result<S::Ok, S::Error>
where
S: LinkedDataSerializer<Term>,
{
match self {
Self::Valid(t) => t.serialize_rdf_with(state, serializer, graph),
Self::Invalid(_) => serializer.end(),
}
}
}
impl<T> SerializeLinkedData for JsonLdLenient<T>
where
T: JsonLdValidate + SerializeLinkedData,
{
fn serialize_rdf<S>(&self, serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
where
S: LinkedDataSerializer<Term>,
{
match self {
Self::Valid(id) => id.serialize_rdf(serializer, graph),
Self::Invalid(_) => serializer.end(),
}
}
}