linked-data 0.2.0

Linked-Data dateset serialization/deserialization traits
Documentation
use rdf_syntax::Quad;

use crate::{LinkedDataSerializer, ser::Error};

pub struct IdSerializer<'a, R, S: ?Sized> {
	inner: &'a mut S,
	resource: Option<R>,
}

impl<'a, R, S: ?Sized> IdSerializer<'a, R, S> {
	pub fn new(inner: &'a mut S) -> Self {
		Self {
			inner,
			resource: None,
		}
	}
}

impl<'a, R: Clone + Ord, S: ?Sized + LinkedDataSerializer<R>> LinkedDataSerializer<R>
	for IdSerializer<'a, R, S>
{
	type Error = S::Error;
	type Ok = Option<R>;

	fn interpret(&mut self, term: Option<rdf_syntax::CowTerm>) -> Result<R, Self::Error> {
		self.inner.interpret(term)
	}

	fn serialize_resource(&mut self, resource: Option<R>) -> Result<R, Self::Error> {
		let r = self.inner.serialize_resource(resource)?;

		if let Some(r) = self.resource.replace(r.clone()) {
			return Err(Error::ambiguous_resource(&r));
		}

		Ok(r)
	}

	fn serialize_quad(&mut self, quad: Quad<R>) -> Result<(), Self::Error> {
		self.inner.serialize_quad(quad)
	}

	fn end(self) -> Result<Self::Ok, Self::Error> {
		Ok(self.resource)
	}
}