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}