Skip to main content

linked_data/ser/
flatten.rs

1use rdf_syntax::Quad;
2
3use crate::LinkedDataSerializer;
4
5/// Flattened resources serializer.
6pub struct FlattenSerializer<'a, R, S> {
7	inner: S,
8	resources: &'a mut Vec<R>,
9	pending: Vec<R>,
10}
11
12impl<'a, R, S> FlattenSerializer<'a, R, S> {
13	pub fn new(inner: S, resources: &'a mut Vec<R>) -> Self
14	where
15		R: Clone,
16	{
17		let mut pending: Vec<R> = resources.clone();
18		pending.reverse();
19
20		Self {
21			inner,
22			resources,
23			pending,
24		}
25	}
26}
27
28impl<'a, R: Clone + Ord, S: LinkedDataSerializer<R>> LinkedDataSerializer<R>
29	for FlattenSerializer<'a, R, S>
30{
31	type Error = S::Error;
32	type Ok = S::Ok;
33
34	fn interpret(&mut self, term: Option<rdf_syntax::CowTerm>) -> Result<R, Self::Error> {
35		self.inner.interpret(term)
36	}
37
38	fn serialize_resource(&mut self, resource: Option<R>) -> Result<R, Self::Error> {
39		let pending_resource = self.pending.pop();
40
41		match (pending_resource, resource) {
42			(Some(a), Some(b)) => {
43				if a == b {
44					Ok(a)
45				} else {
46					Err(crate::ser::Error::ambiguous_resource(&a))
47				}
48			}
49			(Some(a), None) => Ok(a),
50			(None, b) => {
51				let b = self.inner.serialize_resource(b)?;
52				self.resources.push(b.clone());
53				Ok(b)
54			}
55		}
56	}
57
58	fn serialize_quad(&mut self, quad: Quad<R>) -> Result<(), Self::Error> {
59		self.inner.serialize_quad(quad)
60	}
61
62	fn end(self) -> Result<Self::Ok, Self::Error> {
63		self.inner.end()
64	}
65}