1use rdf_syntax::{
2 ConstGenDomain, GenInterpretation, GroundInterpretation, InterpretationMut, Quad, Term,
3 generator::BlankIdGenerator,
4};
5
6use crate::{LinkedDataSerializer, SerializeLinkedData, ser::SerializeLinkedDataWith};
7
8pub struct QuadSerializer<I: GroundInterpretation = GenInterpretation<BlankIdGenerator>> {
9 interpretation: I,
10 quads: Vec<Quad<I::Resource>>,
11}
12
13impl<I: GroundInterpretation> QuadSerializer<I> {
14 pub fn new(interpretation: I) -> Self {
15 Self {
16 interpretation,
17 quads: Vec::new(),
18 }
19 }
20}
21
22#[derive(Debug, thiserror::Error)]
23pub enum QuadSerializationFailed<R = Term> {
24 #[error("ambiguous resource")]
25 AmbiguousResource(R),
26
27 #[error("{0}")]
28 Other(String),
29}
30
31impl<R: Clone> super::Error<R> for QuadSerializationFailed<R> {
32 fn ambiguous_resource(r: &R) -> Self {
33 Self::AmbiguousResource(r.clone())
34 }
35
36 fn custom(str: impl ToString) -> Self {
37 Self::Other(str.to_string())
38 }
39}
40
41impl<I> LinkedDataSerializer<I::Resource> for QuadSerializer<I>
42where
43 I: InterpretationMut + ConstGenDomain,
44 I::Resource: Clone + Ord,
45{
46 type Error = QuadSerializationFailed<I::Resource>;
47 type Ok = Vec<Quad<I::Resource>>;
48
49 fn interpret(&mut self, term: Option<rdf_syntax::CowTerm>) -> Result<I::Resource, Self::Error> {
50 match term {
51 Some(term) => Ok(self.interpretation.insert_term(term)),
52 None => Ok(self.interpretation.new_resource()),
53 }
54 }
55
56 fn serialize_resource(
57 &mut self,
58 resource: Option<I::Resource>,
59 ) -> Result<I::Resource, Self::Error> {
60 match resource {
61 Some(r) => Ok(r),
62 None => Ok(self.interpretation.new_resource()),
63 }
64 }
65
66 fn serialize_quad(&mut self, quad: Quad<I::Resource>) -> Result<(), Self::Error> {
67 self.quads.push(quad);
68 Ok(())
69 }
70
71 fn end(self) -> Result<Self::Ok, Self::Error> {
72 Ok(self.quads)
73 }
74}
75
76pub fn to_rdf_quads(
78 value: impl SerializeLinkedData,
79) -> Result<Vec<Quad<Term>>, QuadSerializationFailed> {
80 value.serialize_rdf(
81 QuadSerializer::new(GenInterpretation::new(BlankIdGenerator::new())),
82 None,
83 )
84}
85
86pub fn to_rdf_quads_with<Q>(
88 value: impl SerializeLinkedDataWith<Q>,
89 state: Q,
90) -> Result<Vec<Quad<Term>>, QuadSerializationFailed> {
91 value.serialize_rdf_with(
92 state,
93 QuadSerializer::new(GenInterpretation::new(BlankIdGenerator::new())),
94 None,
95 )
96}
97
98pub fn to_rdf_quads_interpretation<I>(
100 value: impl SerializeLinkedData<I::Resource>,
101 interpretation: I,
102) -> Result<Vec<Quad<I::Resource>>, QuadSerializationFailed<I::Resource>>
103where
104 I: InterpretationMut + ConstGenDomain,
105 I::Resource: Clone + Ord,
106{
107 value.serialize_rdf(QuadSerializer::new(interpretation), None)
108}
109
110pub fn to_rdf_quads_interpretation_with<Q, I>(
112 value: impl SerializeLinkedDataWith<Q, I::Resource>,
113 interpretation: I,
114 state: Q,
115) -> Result<Vec<Quad<I::Resource>>, QuadSerializationFailed<I::Resource>>
116where
117 I: InterpretationMut + ConstGenDomain,
118 I::Resource: Clone + Ord,
119{
120 value.serialize_rdf_with(state, QuadSerializer::new(interpretation), None)
121}