Skip to main content

linked_data/ser/
id.rs

1use rdf_syntax::Quad;
2
3use crate::{LinkedDataSerializer, ser::Error};
4
5pub struct IdSerializer<'a, R, S: ?Sized> {
6	inner: &'a mut S,
7	resource: Option<R>,
8}
9
10impl<'a, R, S: ?Sized> IdSerializer<'a, R, S> {
11	pub fn new(inner: &'a mut S) -> Self {
12		Self {
13			inner,
14			resource: None,
15		}
16	}
17}
18
19impl<'a, R: Clone + Ord, S: ?Sized + LinkedDataSerializer<R>> LinkedDataSerializer<R>
20	for IdSerializer<'a, R, S>
21{
22	type Error = S::Error;
23	type Ok = Option<R>;
24
25	fn interpret(&mut self, term: Option<rdf_syntax::CowTerm>) -> Result<R, Self::Error> {
26		self.inner.interpret(term)
27	}
28
29	fn serialize_resource(&mut self, resource: Option<R>) -> Result<R, Self::Error> {
30		let r = self.inner.serialize_resource(resource)?;
31
32		if let Some(r) = self.resource.replace(r.clone()) {
33			return Err(Error::ambiguous_resource(&r));
34		}
35
36		Ok(r)
37	}
38
39	fn serialize_quad(&mut self, quad: Quad<R>) -> Result<(), Self::Error> {
40		self.inner.serialize_quad(quad)
41	}
42
43	fn end(self) -> Result<Self::Ok, Self::Error> {
44		Ok(self.resource)
45	}
46}