Skip to main content

linked_data/de/
resources.rs

1use crate::LinkedDataDeserializer;
2
3pub struct ResourcesDeserializer<R, D> {
4	inner: D,
5	resources: Vec<R>,
6}
7
8impl<R, D> ResourcesDeserializer<R, D> {
9	pub fn new(inner: D, resources: impl IntoIterator<Item = R>) -> Self {
10		let mut resources: Vec<R> = resources.into_iter().collect();
11		resources.reverse();
12		Self { inner, resources }
13	}
14}
15
16impl<R: Ord, D: LinkedDataDeserializer<R>> LinkedDataDeserializer<R>
17	for ResourcesDeserializer<R, D>
18{
19	type Error = D::Error;
20
21	fn interpret(&mut self, term: rdf_syntax::CowTerm) -> Result<R, Self::Error> {
22		self.inner.interpret(term)
23	}
24
25	fn terms_of<'r>(
26		&'r self,
27		resource: &'r R,
28	) -> Result<impl Iterator<Item = Result<rdf_syntax::CowTerm<'r>, Self::Error>>, Self::Error> {
29		self.inner.terms_of(resource)
30	}
31
32	fn peek_resources<'a>(
33		&'a self,
34	) -> Result<impl Iterator<Item = Result<&'a R, Self::Error>>, Self::Error>
35	where
36		R: 'a,
37	{
38		Ok(self.resources.iter().rev().map(Ok))
39	}
40
41	fn deserialize_resource(&mut self, resource: Option<R>) -> Result<Option<R>, Self::Error> {
42		match (resource, self.resources.pop()) {
43			(Some(a), Some(b)) => {
44				if a == b {
45					Ok(Some(a))
46				} else {
47					self.resources.push(b);
48					Err(super::Error::unexpected_resource(&a))
49				}
50			}
51			(Some(a), None) => Err(super::Error::unexpected_resource(&a)),
52			(None, Some(a)) => Ok(Some(a)),
53			(None, None) => Ok(None),
54		}
55	}
56
57	fn deserialize_quad<'p>(
58		&mut self,
59		pattern: impl Into<rdf_syntax::pattern::LinearQuadPattern<&'p R>>,
60	) -> Result<Option<rdf_syntax::Quad<R>>, Self::Error>
61	where
62		R: 'p,
63	{
64		self.inner.deserialize_quad(pattern)
65	}
66
67	fn peek_quads<'p>(
68		&'p self,
69		pattern: impl Into<rdf_syntax::pattern::LinearQuadPattern<&'p R>>,
70	) -> Result<impl Iterator<Item = Result<rdf_syntax::Quad<&'p R>, Self::Error>>, Self::Error>
71	where
72		R: 'p,
73	{
74		self.inner.peek_quads(pattern)
75	}
76}