linked_data/de/
resources.rs1use 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}