linked_data/ser/
flatten.rs1use rdf_syntax::Quad;
2
3use crate::LinkedDataSerializer;
4
5pub 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}